/ Hex Artifact Content
Login

Artifact c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
2120: 61 6e 20 72 65 73 75 6c 74 20 65 69 74 68 65 72  an result either
2130: 20 66 72 6f 6d 20 61 6e 20 4f 4f 4d 20 6f 72 20   from an OOM or 
2140: 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 72 6d  because the form
2150: 61 74 74 65 64 20 73 74 72 69 6e 67 0a 20 20 20  atted string.   
2160: 20 2a 2a 20 65 78 63 65 65 64 73 20 53 51 4c 49   ** exceeds SQLI
2170: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 2e  TE_LIMIT_LENGTH.
2180: 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20    In the latter 
2190: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
21a0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 6e 20 65   set.    ** an e
21b0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
21c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21d0: 64 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  d ) pParse->rc =
21e0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
21f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2200: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
2230: 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f  (saveBuf, PARSE_
2240: 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41  TAIL(pParse), PA
2250: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2260: 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49  memset(PARSE_TAI
2270: 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41  L(pParse), 0, PA
2280: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2290: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
22a0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
22b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
22d0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
22f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53  );.  memcpy(PARS
2300: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
2310: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2320: 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AIL_SZ);.  pPars
2330: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2350: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2370: 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68   if zTable is th
2380: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
2390: 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20  stem table that 
23a0: 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69  stores the.** li
23b0: 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20  st of users and 
23c0: 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65  their access cre
23d0: 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74  dentials..*/.int
23e0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
23f0: 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  Table(const char
2400: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74   *zTable){.  ret
2410: 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69  urn sqlite3_stri
2420: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
2430: 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d  ite_user")==0;.}
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c  .#endif../*.** L
2450: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2460: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
2470: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
2480: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
2490: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
24a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
24b0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
24c0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
24d0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
24e0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
24f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2500: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2510: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2520: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2530: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2540: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2550: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2560: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2570: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2580: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
2590: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
25a0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
25b0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
25c0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
25d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
25e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
25f0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2600: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2620: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2630: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2640: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2650: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2660: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2670: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2680: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2690: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
26a0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
26b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c   int i;..  /* Al
26c0: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
26d0: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
26e0: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
26f0: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2700: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2710: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2720: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2730: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2740: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2750: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2760: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
2770: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
2780: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
2790: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27b0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
27c0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
27d0: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
27e0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
27f0: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2810: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
2820: 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69  le(1){.    for(i
2830: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2840: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2850: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c       int j = (i<
2860: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
2870: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
2880: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
2890: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
28a0: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
28b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
28c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
28d0: 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  SName)==0 ){.   
28e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
28f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2900: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
2910: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2920: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2930: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2940: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2960: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2980: 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66  * Not found.  If
2990: 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72   the name we wer
29a0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61  e looking for wa
29b0: 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61  s temp.sqlite_ma
29c0: 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ster.    ** then
29d0: 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65   change the name
29e0: 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   to sqlite_temp_
29f0: 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61  master and try a
2a00: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2a10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a20: 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  zName, MASTER_NA
2a30: 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ME)!=0 ) break;.
2a40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a50: 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73  stricmp(zDatabas
2a60: 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44  e, db->aDb[1].zD
2a70: 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65  bSName)!=0 ) bre
2a80: 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ak;.    zName = 
2a90: 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45  TEMP_MASTER_NAME
2aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2ac0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2ad0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2ae0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2af0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2b00: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2b10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2b20: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2b30: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2b40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2b50: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2b60: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2b80: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2b90: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2ba0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2bb0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2bc0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2bd0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2be0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2bf0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2c00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2c10: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2c20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2c30: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2c40: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2c50: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2c60: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2c70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2c80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2c90: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2ca0: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2cb0: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2cc0: 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20    u32 flags,    
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41           /* LOCA
2ce0: 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54  TE_VIEW or LOCAT
2cf0: 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e  E_NOERR */.  con
2d00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2d30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2d50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2d70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2d80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2d90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2da0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2db0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2dc0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2dd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2de0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2df0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2e00: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2e20: 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e  . */.  if( (db->
2e30: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
2e40: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
2e50: 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54  ==0 .   && SQLIT
2e60: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
2e70: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a  dSchema(pParse).
2e80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e90: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2ea0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
2eb0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
2ec0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ef0: 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  E.    /* If zNam
2f00: 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65  e is the not the
2f10: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
2f20: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63   in the schema c
2f30: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
2f40: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2f50: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2f60: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2f70: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2f80: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ble that.    ** 
2f90: 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d  can be an eponym
2fa0: 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
2fb0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
2fc0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61  arse->disableVta
2fd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f  b==0 ){.      Mo
2fe0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2ff0: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
3000: 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
3010: 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le, zName);.    
3020: 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26    if( pMod==0 &&
3030: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
3040: 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
3050: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
3060: 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69       pMod = sqli
3070: 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65 67  te3PragmaVtabReg
3080: 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29  ister(db, zName)
3090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30a0: 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69  if( pMod && sqli
30b0: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
30c0: 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65  TableInit(pParse
30d0: 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  , pMod) ){.     
30e0: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
30f0: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d  pEpoTab;.      }
3100: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3110: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c 4f    if( flags & LO
3120: 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65 74  CATE_NOERR ) ret
3130: 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72 73  urn 0;.    pPars
3140: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
3150: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
3160: 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26 20  IsVirtual(p) && 
3170: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
3180: 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20 30  tab ){.    p = 0
3190: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d  ;.  }..  if( p==
31a0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
31b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
31c0: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
31d0: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
31e0: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
31f0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
3200: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
3210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3220: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3230: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3240: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
3250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3260: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3270: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3280: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3290: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  }..  return p;.}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
32b0: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
32c0: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
32d0: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
32e0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
32f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
3300: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
3310: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
3320: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
3330: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
3340: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
3350: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
3360: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
3370: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
3380: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
3390: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
33a0: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
33b0: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
33c0: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
33d0: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
33e0: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
33f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
3400: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
3410: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
3420: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3430: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
3440: 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20  *pParse, .  u32 
3450: 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20  flags,.  struct 
3460: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3470: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3480: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3490: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
34a0: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
34b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
34c0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
34d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
34e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
34f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
3500: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
3510: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3520: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d  b].zDbSName;.  }
3530: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3540: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3550: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3560: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3570: 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e  arse, flags, p->
3580: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
3590: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
35a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
35b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
35c0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
35d0: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
35e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
35f0: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
3600: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
3610: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
3620: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
3630: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
3640: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
3650: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
3660: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
3670: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
3680: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
3690: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
36a0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
36b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
36c0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
36d0: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
36e0: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
36f0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
3700: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
3710: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
3720: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
3730: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
3740: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
3750: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
3760: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
3770: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
3780: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3790: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
37a0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
37b0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
37c0: 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20  int i;.  /* All 
37d0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
37e0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
37f0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
3800: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
3810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3820: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3830: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3840: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3850: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3860: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3870: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3880: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3890: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
38a0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
38b0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
38c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
38d0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
38e0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
38f0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
3900: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
3910: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
3920: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
3930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3940: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3950: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
3960: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
3970: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
3980: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
3990: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
39a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
39b0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
39c0: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
39d0: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
39e0: 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ndex.*/.void sql
39f0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71  ite3FreeIndex(sq
3a00: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
3a10: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
3a20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
3a30: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
3a40: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
3a50: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , p);.#endif.  s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
3a80: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
3a90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3aa0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29  db, p->aColExpr)
3ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3ac0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3ad0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3ae0: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3af0: 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20  bFree(db, (void 
3b00: 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  *)p->azColl);.#i
3b10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3b20: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
3b30: 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  4.  sqlite3_free
3b40: 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23  (p->aiRowEst);.#
3b50: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
3b60: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
3b70: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
3b80: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
3b90: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
3ba0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3bb0: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3bc0: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
3bd0: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
3be0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
3bf0: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
3c00: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3c10: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3c20: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3c30: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3c40: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
3c50: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
3c60: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
3c70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
3c80: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
3c90: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
3ca0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3cb0: 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20   Hash *pHash;.. 
3cc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3cd0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3ce0: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
3cf0: 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44   pHash = &db->aD
3d00: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
3d10: 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65  idxHash;.  pInde
3d20: 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  x = sqlite3HashI
3d30: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64  nsert(pHash, zId
3d40: 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  xName, 0);.  if(
3d50: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
3d60: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
3d70: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3d80: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
3d90: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
3da0: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3db0: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3dd0: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3de0: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3df0: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3e00: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3e10: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
3e20: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
3e30: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
3e40: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3e50: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
3e60: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
3e70: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
3e80: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
3e90: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
3ea0: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
3eb0: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3ec0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3ed0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3ee0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3ef0: 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78  sqlite3FreeIndex
3f00: 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
3f10: 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  }.  db->mDbFlags
3f20: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
3f30: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
3f40: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3f50: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3f60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3f70: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3f80: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3f90: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3fa0: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3fb0: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3fc0: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3fd0: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3fe0: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
3ff0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
4000: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
4010: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
4020: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
4030: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
4040: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
4050: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
4060: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
4070: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4080: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
4090: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
40a0: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
40b0: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
40c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
40d0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
40e0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
40f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
4100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
4110: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4120: 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a 20  Db->zDbSName);. 
4130: 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
4140: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
4150: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
4160: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
4170: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
4180: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
4190: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
41a0: 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20   db->nDb = j;.  
41b0: 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26  if( db->nDb<=2 &
41c0: 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61  & db->aDb!=db->a
41d0: 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  DbStatic ){.    
41e0: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74  memcpy(db->aDbSt
41f0: 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32  atic, db->aDb, 2
4200: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
4210: 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0]));.    sqlite
4220: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
4230: 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44  aDb);.    db->aD
4240: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
4250: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
4260: 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  Reset the schema
4270: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
4280: 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20  e at index iDb. 
4290: 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a   Also reset the.
42a0: 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 20  ** TEMP schema. 
42b0: 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64 65   The reset is de
42c0: 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e 53  ferred if db->nS
42d0: 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f 74  chemaLock is not
42e0: 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72 72   zero..** Deferr
42f0: 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62 65  ed resets may be
4300: 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20   run by calling 
4310: 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a 76  with iDb<0..*/.v
4320: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4330: 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65  OneSchema(sqlite
4340: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
4350: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
4360: 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
4370: 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d 30  );..  if( iDb>=0
4380: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4390: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
43a0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
43b0: 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74 50  0) );.    DbSetP
43c0: 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62 2c  roperty(db, iDb,
43d0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
43e0: 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65  ;.    DbSetPrope
43f0: 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52 65  rty(db, 1, DB_Re
4400: 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20  setWanted);.    
4410: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20  db->mDbFlags &= 
4420: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e  ~DBFLAG_SchemaKn
4430: 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66  ownOk;.  }..  if
4440: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4450: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  k==0 ){.    for(
4460: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
4470: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4480: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
4490: 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61 6e  , i, DB_ResetWan
44a0: 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
44b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
44c0: 61 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53  ar(db->aDb[i].pS
44d0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 0a  chema);.      }.
44e0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
44f0: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
4500: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
4510: 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65  from all attache
4520: 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63  d databases (inc
4530: 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22  luding.** "main"
4540: 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72   and "temp") for
4550: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
4560: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
4570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
4580: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
4590: 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65  onnection(sqlite
45a0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
45b0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
45c0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
45d0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
45e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
45f0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4600: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4610: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
4620: 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d    if( db->nSchem
4630: 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  aLock==0 ){.    
4640: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
4650: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4660: 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ema);.      }els
4670: 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65 74  e{.        DbSet
4680: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
4690: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b  DB_ResetWanted);
46a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
46b0: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
46c0: 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53 63  s &= ~(DBFLAG_Sc
46d0: 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c 41  hemaChange|DBFLA
46e0: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
46f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
4700: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
4710: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
4720: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66 28  veAll(db);.  if(
4730: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
4740: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
4750: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
4760: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 7d  seArray(db);.  }
4770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4780: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4790: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
47a0: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
47b0: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
47c0: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
47d0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
47e0: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46  mDbFlags &= ~DBF
47f0: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
4800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4810: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
4820: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
4830: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
4840: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
4850: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
4860: 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20  array)..*/.void 
4870: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
4880: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4890: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
48a0: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
48b0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
48c0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
48d0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
48e0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
48f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
4900: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4910: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
4920: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4930: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4940: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
4950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4960: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
4970: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4980: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4990: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
49a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
49b0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
49c0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
49d0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
49e0: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
49f0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4a00: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4a10: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
4a20: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
4a30: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
4a40: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
4a50: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
4a60: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
4a70: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
4a80: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
4a90: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
4aa0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
4ab0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
4ac0: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
4ad0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4ae0: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4af0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4b00: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4b10: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
4b20: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
4b30: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
4b40: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
4b50: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
4b60: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
4b70: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
4b80: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
4b90: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
4ba0: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
4bb0: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
4bc0: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
4bd0: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4be0: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4bf0: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4c00: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4c10: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4c20: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4c30: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4c40: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4c50: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4c60: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
4c70: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65  TE_NOINLINE dele
4c80: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4c90: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4ca0: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
4cb0: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23  ndex, *pNext;..#
4cc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4cd0: 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  UG.  /* Record t
4ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
4cf0: 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69  standing lookasi
4d00: 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69  de allocations i
4d10: 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a  n schema Tables.
4d20: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f    ** prior to do
4d30: 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f  ing any free() o
4d40: 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63  perations.  Sinc
4d50: 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20  e schema Tables 
4d60: 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20  do not use.  ** 
4d70: 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20  lookaside, this 
4d80: 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f  number should no
4d90: 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69  t change. */.  i
4da0: 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  nt nLookaside = 
4db0: 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28  0;.  if( db && (
4dc0: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4dd0: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b  ==0 ){.    nLook
4df0: 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c  aside = sqlite3L
4e00: 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c  ookasideUsed(db,
4e10: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
4e20: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
4e30: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
4e40: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
4e50: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
4e60: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
4e70: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
4e80: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
4e90: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
4ea0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
4eb0: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63  ert( pIndex->pSc
4ec0: 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53  hema==pTable->pS
4ed0: 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c  chema.         |
4ee0: 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61  | (IsVirtual(pTa
4ef0: 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e  ble) && pIndex->
4f00: 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
4f10: 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20  IDXTYPE_APPDEF) 
4f20: 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d  );.    if( (db==
4f30: 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  0 || db->pnBytes
4f40: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73  Freed==0) && !Is
4f50: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
4f60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4f70: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
4f80: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4f90: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4fa0: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
4fb0: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
4fc0: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
4fd0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
4fe0: 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b  Name, 0.      );
4ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
5000: 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  b==0 || sqlite3S
5010: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5020: 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
5030: 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
5040: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49  assert( pOld==pI
5050: 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20  ndex || pOld==0 
5060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
5070: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62  ite3FreeIndex(db
5080: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a  , pIndex);.  }..
5090: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
50a0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74  foreign keys att
50b0: 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61  ached to this ta
50c0: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
50d0: 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54  3FkDelete(db, pT
50e0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  able);..  /* Del
50f0: 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74  ete the Table st
5100: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a  ructure itself..
5110: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65    */.  sqlite3De
5120: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
5130: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
5140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5150: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
5160: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5170: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
5180: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
5190: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
51a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
51b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
51c0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
51d0: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
51e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
5200: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c  .  sqlite3VtabCl
5210: 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ear(db, pTable);
5220: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
5230: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
5240: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  le);..  /* Verif
5250: 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73  y that no lookas
5260: 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75  ide memory was u
5270: 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61  sed by schema ta
5280: 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  bles */.  assert
5290: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20  ( nLookaside==0 
52a0: 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73  || nLookaside==s
52b0: 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55  qlite3LookasideU
52c0: 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76  sed(db,0) );.}.v
52d0: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
52e0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
52f0: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
5300: 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  e){.  /* Do not 
5310: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
5320: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
5330: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
5340: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
5350: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
5360: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
5370: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
5380: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
5390: 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30  able->nTabRef)>0
53a0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65  ) ) return;.  de
53b0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
53c0: 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  able);.}.../*.**
53d0: 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65   Unlink the give
53e0: 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  n table from the
53f0: 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64   hash tables and
5400: 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a   the delete the.
5410: 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  ** table structu
5420: 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20  re with all its 
5430: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
5440: 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69  ign keys..*/.voi
5450: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
5460: 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  ndDeleteTable(sq
5470: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
5480: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
5490: 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62  zTabName){.  Tab
54a0: 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62  le *p;.  Db *pDb
54b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
54c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
54d0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
54e0: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
54f0: 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20  t( zTabName );. 
5500: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5510: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
5520: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
5530: 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e   testcase( zTabN
5540: 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a  ame[0]==0 );  /*
5550: 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62   Zero-length tab
5560: 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c  le names are all
5570: 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20  owed */.  pDb = 
5580: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
5590: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
55a0: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
55b0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
55c0: 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  TabName, 0);.  s
55d0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
55e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
55f0: 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c  mDbFlags |= DBFL
5600: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
5610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5620: 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20  a token, return 
5630: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
5640: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65  nsists of the te
5650: 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f  xt of that.** to
5660: 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ken.  Space to h
5670: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
5680: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62   string.** is ob
5690: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
56a0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d  teMalloc() and m
56b0: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
56c0: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
56d0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  unction..**.** A
56e0: 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72  ny quotation mar
56f0: 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c  ks (ex:  "name",
5700: 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c   'name', [name],
5710: 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74   or `name`) that
5720: 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65  .** surround the
5730: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b   body of the tok
5740: 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a  en are removed..
5750: 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65  **.** Tokens are
5760: 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e   often just poin
5770: 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72  ters into the or
5780: 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20  iginal SQL text 
5790: 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f  and so.** are no
57a0: 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65  t \000 terminate
57b0: 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65  d and are not pe
57c0: 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72  rsistent.  The r
57d0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
57e0: 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e  * is \000 termin
57f0: 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73  ated and is pers
5800: 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20  istent..*/.char 
5810: 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d  *sqlite3NameFrom
5820: 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64  Token(sqlite3 *d
5830: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5840: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
5850: 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
5860: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
5870: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5880: 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a   (char*)pName->z
5890: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
58a0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
58b0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
58c0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
58d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
58e0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
58f0: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
5900: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
5910: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
5920: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
5930: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
5940: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
5950: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
5960: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
5970: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
5980: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
5990: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
59a0: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
59b0: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
59c0: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
59d0: 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f  ROOT, 1, MASTER_
59e0: 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  NAME);.  sqlite3
59f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5a00: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5a10: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5a20: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5a30: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5a40: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5a60: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
5a70: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
5a80: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
5a90: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
5aa0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
5ab0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
5ac0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5ad0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5ae0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5af0: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5b00: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5b10: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5b20: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5b30: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5b40: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5b50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b60: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
5b70: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
5b80: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
5b90: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
5ba0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
5bb0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
5bc0: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
5bd0: 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  Db;.    for(i=(d
5be0: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
5bf0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
5c00: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
5c10: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
5c20: 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d  te3_stricmp(pDb-
5c30: 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65  >zDbSName, zName
5c40: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
5c50: 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c   /* "main" is al
5c60: 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62  ways an acceptab
5c70: 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  le alias for the
5c80: 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73   primary databas
5c90: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
5ca0: 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  if it has been r
5cb0: 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c  enamed using SQL
5cc0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49  ITE_DBCONFIG_MAI
5cd0: 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20  NDBNAME. */.    
5ce0: 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d    if( i==0 && 0=
5cf0: 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
5d00: 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20  ("main", zName) 
5d10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
5d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
5d30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
5d40: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
5d50: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
5d60: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
5d70: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
5d80: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5d90: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5da0: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
5db0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
5dc0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5dd0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5de0: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
5df0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5e00: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
5e10: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
5e20: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
5e30: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5e40: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e70: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5e80: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
5e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5eb0: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
5ec0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
5ed0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5ee0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5ef0: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
5f00: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
5f10: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
5f20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
5f30: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
5f40: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
5f50: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
5f60: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
5f70: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
5f80: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
5f90: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5fa0: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5fb0: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5fc0: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5fd0: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
5fe0: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5ff0: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
6000: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
6010: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
6020: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
6030: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
6040: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
6050: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
6060: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
6070: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
6080: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
6090: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
60a0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
60b0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
60c0: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
60d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
60e0: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
60f0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
6100: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
6110: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
6120: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
6130: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
6140: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
6150: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
6160: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
6170: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
6180: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
6190: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
61a0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
61b0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
61c0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
61d0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
61e0: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
61f0: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
6200: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
6210: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
6220: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
6230: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
6240: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
6250: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
6260: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
6270: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
6280: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
6290: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
62a0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
62b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
62c0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
62d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
62e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
62f0: 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
6300: 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20   pName2!=0 );.  
6310: 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20  if( pName2->n>0 
6320: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
6330: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
6340: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6350: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
6360: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
6370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
6380: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71  .    }.    *pUnq
6390: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
63a0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
63b0: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
63c0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
63d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
63e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
63f0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
6400: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
6410: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
6420: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
6430: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
6440: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c  ->init.iDb==0 ||
6450: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
6460: 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  | IN_RENAME_OBJE
6470: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  CT.             
6480: 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73  || (db->mDbFlags
6490: 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d   & DBFLAG_Vacuum
64a0: 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d  )!=0);.    iDb =
64b0: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
64c0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
64d0: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
64e0: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
64f0: 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20   True if PRAGMA 
6500: 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20  writable_schema 
6510: 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  is ON.*/.int sql
6520: 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65  ite3WritableSche
6530: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ma(sqlite3 *db){
6540: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6550: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6560: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6570: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6580: 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
6590: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
65a0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
65b0: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
65c0: 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ))==.           
65d0: 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65      SQLITE_Write
65e0: 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74  Schema );.  test
65f0: 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73  case( (db->flags
6600: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
6610: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6620: 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20  nsive))==.      
6630: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6640: 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74  Defensive );.  t
6650: 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c  estcase( (db->fl
6660: 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74  ags&(SQLITE_Writ
6670: 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44  eSchema|SQLITE_D
6680: 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20  efensive))==.   
6690: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
66a0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
66b0: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
66c0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64  ) );.  return (d
66d0: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
66e0: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
66f0: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
6700: 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  =SQLITE_WriteSch
6710: 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ema;.}../*.** Th
6720: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6730: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
6740: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
6750: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
6760: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
6770: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
6780: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
6790: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
67a0: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
67b0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
67c0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
67d0: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
67e0: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
67f0: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
6800: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
6810: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
6820: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
6830: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
6840: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
6850: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
6860: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
6870: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
6880: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
6890: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
68a0: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
68b0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
68c0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
68d0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
68e0: 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61  e3WritableSchema
68f0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a  (pParse->db)==0.
6900: 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d            && 0==
6910: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
6920: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
6930: 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 7) ){.    sqli
6940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6950: 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65  se, "object name
6960: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e   reserved for in
6970: 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c  ternal use: %s",
6980: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74   zName);.    ret
6990: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
69a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
69b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
69c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52  ** Return the PR
69d0: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
69e0: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e  of a table.*/.In
69f0: 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d  dex *sqlite3Prim
6a00: 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c  aryKeyIndex(Tabl
6a10: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65  e *pTab){.  Inde
6a20: 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54  x *p;.  for(p=pT
6a30: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26  ab->pIndex; p &&
6a40: 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e   !IsPrimaryKeyIn
6a50: 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65  dex(p); p=p->pNe
6a60: 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70  xt){}.  return p
6a70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6a80: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  n the column of 
6a90: 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20  index pIdx that 
6aa0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
6ab0: 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69  able.** column i
6ac0: 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  Col.  Return -1 
6ad0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
6ae0: 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75  .i16 sqlite3Colu
6af0: 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20  mnOfIndex(Index 
6b00: 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29  *pIdx, i16 iCol)
6b10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
6b20: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
6b30: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
6b40: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d   if( iCol==pIdx-
6b50: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72  >aiColumn[i] ) r
6b60: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
6b70: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
6b80: 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75  ** Begin constru
6b90: 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  cting a new tabl
6ba0: 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
6bb0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
6bc0: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
6bd0: 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74  t of several act
6be0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ion routines tha
6bf0: 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20  t get called in 
6c00: 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61  response.** to a
6c10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6c20: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72  atement.  In par
6c30: 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f  ticular, this ro
6c40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a  utine is called.
6c50: 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20  ** after seeing 
6c60: 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20  tokens "CREATE" 
6c70: 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20  and "TABLE" and 
6c80: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  the table name. 
6c90: 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c  The isTemp.** fl
6ca0: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
6cb0: 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  e table should b
6cc0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
6cd0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
6ce0: 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  se.** file inste
6cf0: 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69  ad of in the mai
6d00: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
6d10: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
6d20: 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77  ly the case.** w
6d30: 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f  hen the "TEMP" o
6d40: 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65  r "TEMPORARY" ke
6d50: 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20  yword occurs in 
6d60: 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54  between.** CREAT
6d70: 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a  E and TABLE..**.
6d80: 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65  ** The new table
6d90: 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69   record is initi
6da0: 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69  alized and put i
6db0: 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  n pParse->pNewTa
6dc0: 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20  ble..** As more 
6dd0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
6de0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73  BLE statement is
6df0: 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f   parsed, additio
6e00: 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f  nal action.** ro
6e10: 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63  utines will be c
6e20: 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72  alled to add mor
6e30: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
6e40: 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a   this record..**
6e50: 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
6e60: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
6e70: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73  statement, the s
6e80: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
6e90: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
6ea0: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
6eb0: 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69  e the constructi
6ec0: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  on of the new ta
6ed0: 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76  ble record..*/.v
6ee0: 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74  oid sqlite3Start
6ef0: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
6f00: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
6f10: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
6f20: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
6f30: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
6f40: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6f50: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6f60: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6f70: 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64  me2,   /* Second
6f80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d   part of the nam
6f90: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
6fa0: 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  r view */.  int 
6fb0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20  isTemp,      /* 
6fc0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6fd0: 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a  a TEMP table */.
6fe0: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
6ff0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7000: 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a  is is a VIEW */.
7010: 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c    int isVirtual,
7020: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7030: 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20  is is a VIRTUAL 
7040: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
7050: 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44  oErr        /* D
7060: 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62  o nothing if tab
7070: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
7080: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
7090: 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20  *pTable;.  char 
70a0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54  *zName = 0; /* T
70b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e  he name of the n
70c0: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
70d0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
70e0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
70f0: 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  v;.  int iDb;   
7100: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7110: 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61  e number to crea
7120: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
7130: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
7140: 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69  e;    /* Unquali
7150: 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65  fied name of the
7160: 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65   table to create
7170: 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69   */..  if( db->i
7180: 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e  nit.busy && db->
7190: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20  init.newTnum==1 
71a0: 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61  ){.    /* Specia
71b0: 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67  l case:  Parsing
71c0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
71d0: 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d  er or sqlite_tem
71e0: 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20  p_master schema 
71f0: 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d  */.    iDb = db-
7200: 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a  >init.iDb;.    z
7210: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
7220: 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d  StrDup(db, SCHEM
7230: 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20  A_TABLE(iDb));. 
7240: 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65     pName = pName
7250: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7260: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
7270: 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  se */.    iDb = 
7280: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
7290: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
72a0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
72b0: 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
72c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
72d0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
72e0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
72f0: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
7300: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=1 ){.      /* 
7310: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
7320: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
7330: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
7340: 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20  alified. Unless 
7350: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
7360: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22  tabase name is "
7370: 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a  temp" anyway.  *
7380: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
7390: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
73a0: 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65  "temporary table
73b0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e   name must be un
73c0: 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20  qualified");.   
73d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
73e0: 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
73f0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
7400: 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a  ) iDb = 1;.    z
7410: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
7420: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
7430: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
7440: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
7450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7460: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
7470: 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a  pParse, (void*)z
7480: 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  Name, pName);.  
7490: 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65    }.  }.  pParse
74a0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
74b0: 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61  pName;.  if( zNa
74c0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
74d0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
74e0: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
74f0: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
7500: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
7510: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7520: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
7530: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
7540: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
7550: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7560: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
7570: 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70    assert( isTemp
7580: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31  ==0 || isTemp==1
7590: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
75a0: 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65  View==0 || isVie
75b0: 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20  w==1 );.  {.    
75c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
75d0: 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCode[] = {.    
75e0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
75f0: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7600: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
7610: 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  P_TABLE,.       
7620: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49  SQLITE_CREATE_VI
7630: 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54  EW,.       SQLIT
7640: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49  E_CREATE_TEMP_VI
7650: 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68  EW.    };.    ch
7660: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
7670: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
7680: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7690: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
76a0: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
76b0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
76c0: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
76d0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
76e0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
76f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7700: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
7710: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7720: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
7730: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
7740: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7770: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7780: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7790: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
77a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
77b0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
77c0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
77d0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
77e0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
77f0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7800: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
7810: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
7820: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
7830: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
7840: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
7850: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
7860: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7870: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7880: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7890: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
78a0: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
78b0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
78c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
78d0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
78e0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
78f0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
7900: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
7910: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
7920: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
7930: 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45  IN_SPECIAL_PARSE
7940: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
7950: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
7960: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
7970: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
7980: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
7990: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20  pParse) ){.     
79a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
79b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
79c0: 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69     pTable = sqli
79d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
79e0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20   zName, zDb);.  
79f0: 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a    if( pTable ){.
7a00: 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72        if( !noErr
7a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7a20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7a30: 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c  se, "table %T al
7a40: 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70  ready exists", p
7a50: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
7a60: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7a70: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
7a80: 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  sy || CORRUPT_DB
7a90: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
7aa0: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
7ab0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
7ac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ad0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7ae0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7af0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
7b00: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
7b10: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
7b20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7b30: 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72  sg(pParse, "ther
7b40: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
7b50: 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c  index named %s",
7b60: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67   zName);.      g
7b70: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7b80: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
7b90: 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c  ..  pTable = sql
7ba0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7bb0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
7bc0: 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  e));.  if( pTabl
7bd0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  e==0 ){.    asse
7be0: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
7bf0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72  iled );.    pPar
7c00: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
7c10: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
7c20: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
7c30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7c40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
7c50: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
7c60: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
7c70: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
7c80: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7c90: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7ca0: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
7cb0: 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  e->nTabRef = 1;.
7cc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7cd0: 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70  FAULT_ROWEST.  p
7ce0: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7cf0: 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
7d00: 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
7d10: 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a  _ROWEST);.#else.
7d20: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f    pTable->nRowLo
7d30: 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
7d40: 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
7d50: 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
7d60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
7d70: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
7d80: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
7d90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
7da0: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7db0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
7dc0: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
7dd0: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
7de0: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
7df0: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
7e00: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
7e10: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
7e20: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7e30: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
7e40: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
7e50: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7e60: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7e90: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7ea0: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7eb0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
7ec0: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
7ed0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7ee0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7ef0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
7f00: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
7f10: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
7f20: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
7f30: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
7f40: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
7f50: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7f60: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7f70: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7f80: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7f90: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7fa0: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7fb0: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
7fc0: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
7fd0: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
7fe0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7ff0: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
8000: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
8010: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
8020: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
8030: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
8040: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
8050: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
8060: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
8070: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
8080: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
8090: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
80a0: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
80b0: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
80c0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
80d0: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
80e0: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
80f0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
8100: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
8110: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
8120: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
8130: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
8140: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
8150: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
8160: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
8170: 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20  /* nullRow[] is 
8180: 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63  an OP_Record enc
8190: 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63  oding of a row c
81a0: 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c  ontaining 5 NULL
81b0: 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
81c0: 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52  const char nullR
81d0: 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30  ow[] = { 6, 0, 0
81e0: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
81f0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
8200: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
8210: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
8220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8230: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8240: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
8250: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8260: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
8270: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
8280: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
8290: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
82a0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
82b0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
82c0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
82d0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
82e0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
82f0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
8300: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
8310: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
8320: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
8330: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
8340: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
8350: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
8360: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
8370: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8380: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
8390: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
83a0: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
83b0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
83c0: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
83d0: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
83e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
83f0: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64  OP_If, reg3); Vd
8400: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8410: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
8420: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8430: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
8440: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
8450: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
8460: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
8470: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
8480: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8490: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
84a0: 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52  , BTREE_FILE_FOR
84b0: 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29  MAT, fileFormat)
84c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
84d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
84e0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
84f0: 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e  REE_TEXT_ENCODIN
8500: 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20  G, ENC(db));.   
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
8520: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
8530: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
8540: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
8550: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
8560: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
8570: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
8580: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
8590: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
85a0: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
85b0: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
85c0: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
85d0: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
85e0: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
85f0: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
8600: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
8610: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
8620: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
8630: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
8640: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
8650: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
8660: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
8670: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
8680: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
8690: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
86a0: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
86b0: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
86c0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
86d0: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
86e0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
86f0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
8700: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
8710: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
8720: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8730: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
8740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8750: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8760: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
8770: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
8780: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8790: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
87a0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
87b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
87c0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
87d0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
87e0: 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c  b =.         sql
87f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8800: 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  , OP_CreateBtree
8810: 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52  , iDb, reg2, BTR
8820: 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20  EE_INTKEY);.    
8830: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65  }.    sqlite3Ope
8840: 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61  nMasterTable(pPa
8850: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
8860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8870: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
8880: 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73   0, reg1);.    s
8890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
88a0: 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20  (v, OP_Blob, 6, 
88b0: 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77  reg3, 0, nullRow
88c0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
88d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88e0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
88f0: 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29  , 0, reg3, reg1)
8900: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8910: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8920: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8940: 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b  p0(v, OP_Close);
8950: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
8960: 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65  l (non-error) re
8970: 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72  turn. */.  retur
8980: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  n;..  /* If an e
8990: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20  rror occurs, we 
89a0: 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67  jump here */.beg
89b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a  in_table_error:.
89c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
89d0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
89e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20  turn;.}../* Set 
89f0: 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20  properties of a 
8a00: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73  table column bas
8a10: 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63  ed on the (magic
8a20: 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  al).** name of t
8a30: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69  he column..*/.#i
8a40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8a50: 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76  HIDDEN_COLUMNS.v
8a60: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  oid sqlite3Colum
8a70: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
8a80: 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  ame(Table *pTab,
8a90: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
8aa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
8ab0: 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  rnicmp(pCol->zNa
8ac0: 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22  me, "__hidden__"
8ad0: 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 10)==0 ){.    
8ae0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
8af0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e  = COLFLAG_HIDDEN
8b00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54  ;.  }else if( pT
8b10: 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62  ab && pCol!=pTab
8b20: 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b  ->aCol && (pCol[
8b30: 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43  -1].colFlags & C
8b40: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29  OLFLAG_HIDDEN) )
8b50: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  {.    pTab->tabF
8b60: 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69  lags |= TF_OOOHi
8b70: 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  dden;.  }.}.#end
8b80: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
8b90: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
8ba0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8bb0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
8bc0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
8bd0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
8be0: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
8bf0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
8c00: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
8c10: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8c20: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
8c30: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
8c40: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
8c50: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
8c60: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
8c70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8c80: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
8c90: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
8ca0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
8cb0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
8cc0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c  e, Token *pName,
8cd0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
8ce0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
8cf0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
8d00: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20    char *zType;. 
8d10: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
8d20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8d30: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8d40: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8d50: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8d60: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  turn;.  if( p->n
8d70: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
8d80: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8d90: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
8da0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8db0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8dc0: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
8dd0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
8de0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  turn;.  }.  z = 
8df0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
8e00: 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20  aw(db, pName->n 
8e10: 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b  + pType->n + 2);
8e20: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
8e30: 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52  turn;.  if( IN_R
8e40: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73  ENAME_OBJECT ) s
8e50: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
8e60: 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
8e70: 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20  id*)z, pName);. 
8e80: 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65   memcpy(z, pName
8e90: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
8ea0: 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20    z[pName->n] = 
8eb0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
8ec0: 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d  ote(z);.  for(i=
8ed0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
8ee0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
8ef0: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70  te3_stricmp(z, p
8f00: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8f10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8f20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8f30: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
8f40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
8f50: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
8f60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
8f70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8f80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
8f90: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
8fa0: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
8fb0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
8fc0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
8fd0: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
8fe0: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
8ff0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
9000: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
9010: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9020: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
9030: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
9040: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
9050: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
9060: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9070: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
9080: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
9090: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
90a0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
90b0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  .  sqlite3Column
90c0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
90d0: 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20  me(p, pCol);. . 
90e0: 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30   if( pType->n==0
90f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
9100: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
9110: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
9120: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
9130: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20  lt affinity.    
9140: 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61  ** 'BLOB' with a
9150: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66   default size of
9160: 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
9170: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
9180: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  = SQLITE_AFF_BLO
9190: 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  B;.    pCol->szE
91a0: 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  st = 1;.#ifdef S
91b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
91c0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
91d0: 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65     if( 4>=sqlite
91e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
91f0: 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20  SorterRef ){.   
9200: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
9210: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  s |= COLFLAG_SOR
9220: 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65  TERREF;.    }.#e
9230: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
9240: 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71    zType = z + sq
9250: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
9260: 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79   + 1;.    memcpy
9270: 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a  (zType, pType->z
9280: 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20  , pType->n);.   
9290: 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d   zType[pType->n]
92a0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
92b0: 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b  3Dequote(zType);
92c0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
92d0: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66  ity = sqlite3Aff
92e0: 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c  inityType(zType,
92f0: 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c   pCol);.    pCol
9300: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
9310: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
9320: 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a   }.  p->nCol++;.
9330: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72    pParse->constr
9340: 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a  aintName.n = 0;.
9350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9360: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9370: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9380: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9390: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
93a0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
93b0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
93c0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
93d0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
93e0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
93f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
9400: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
9410: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
9420: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
9430: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9440: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
9450: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
9460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
9470: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
9480: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9490: 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61  *pCol;.  p = pPa
94a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
94b0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
94c0: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
94d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20   return;.  pCol 
94e0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
94f0: 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e  ol-1];.  pCol->n
9500: 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45  otNull = (u8)onE
9510: 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c  rror;.  p->tabFl
9520: 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74  ags |= TF_HasNot
9530: 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  Null;..  /* Set 
9540: 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  the uniqNotNull 
9550: 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51  flag on any UNIQ
9560: 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73  UE or PK indexes
9570: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
9580: 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f  .  ** on this co
9590: 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20  lumn.  */.  if( 
95a0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
95b0: 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20   COLFLAG_UNIQUE 
95c0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
95d0: 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
95e0: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
95f0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
9600: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
9610: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
9620: 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45  ==1 && pIdx->onE
9630: 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
9640: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9650: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d  >aiColumn[0]==p-
9660: 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  >nCol-1 ){.     
9670: 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74     pIdx->uniqNot
9680: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20  Null = 1;.      
9690: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
96a0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
96b0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
96c0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
96d0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
96e0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
96f0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
9700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9710: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
9720: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
9730: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
9740: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
9750: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
9760: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
9770: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9780: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
9790: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
97a0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
97b0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
97c0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
97d0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
97e0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
97f0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
9800: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
9810: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
9820: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
9830: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
9840: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
9850: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
9860: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
9870: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
9880: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
98b0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
98c0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
98d0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
98e0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
98f0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
9900: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
9910: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
9920: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
9930: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
9940: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
9950: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  | SQLITE_AFF_BLO
9960: 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  B.** 'REAL'     
9970: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9980: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
9990: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
99a0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
99b0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
99c0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
99d0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
99e0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
99f0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
9a00: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
9a10: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
9a20: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
9a30: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
9a40: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
9a50: 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20  ar *zIn, Column 
9a60: 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20  *pCol){.  u32 h 
9a70: 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20  = 0;.  char aff 
9a80: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
9a90: 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ERIC;.  const ch
9aa0: 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a  ar *zChar = 0;..
9ab0: 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30    assert( zIn!=0
9ac0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e   );.  while( zIn
9ad0: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
9ae0: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
9af0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
9b00: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
9b10: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
9b20: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
9b30: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
9b40: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
9b50: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
9b60: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9b70: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
9b80: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
9b90: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9ba0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
9bb0: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
9bc0: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
9bd0: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
9be0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9bf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9c00: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
9c10: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
9c20: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
9c30: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
9c40: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9c50: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9c60: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
9c70: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9c80: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
9c90: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
9ca0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
9cb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9cc0: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
9cd0: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
9ce0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9cf0: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
9d00: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
9d10: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
9d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9d30: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
9d40: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
9d50: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
9d60: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
9d70: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
9d80: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
9d90: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9da0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9db0: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9dc0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9dd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9de0: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
9df0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
9e00: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
9e10: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
9e20: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9e30: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9e40: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9e50: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
9e60: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
9e70: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
9e80: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
9e90: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
9ea0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9eb0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9ec0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9ed0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9ee0: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
9ef0: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
9f00: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
9f10: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
9f20: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9f30: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9f40: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
9f50: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
9f60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9f70: 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e  If pCol is not N
9f80: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
9f90: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
9fa0: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
9fb0: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
9fc0: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
9fd0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
9fe0: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
9ff0: 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
a000: 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f    int v = 0;   /
a010: 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69  * default size i
a020: 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73  s approx 4 bytes
a030: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c   */.    if( aff<
a040: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
a050: 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  IC ){.      if( 
a060: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
a070: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
a080: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a090: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
a0a0: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f            /* BLO
a0c0: 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29  B(k), VARCHAR(k)
a0d0: 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28  , CHAR(k) -> r=(
a0e0: 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20  k/4+1) */.      
a0f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
a100: 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29  Int32(zChar, &v)
a110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
a120: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
a130: 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72  .          zChar
a140: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
a150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a160: 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20     v = 16;   /* 
a170: 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42  BLOB, TEXT, CLOB
a180: 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78   -> r=5  (approx
a190: 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20   20 bytes)*/.   
a1a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
a1b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a1c0: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
a1d0: 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c  S.    if( v>=sql
a1e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
a1f0: 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a  .szSorterRef ){.
a200: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
a210: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a220: 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d  SORTERREF;.    }
a230: 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20  .#endif.    v = 
a240: 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  v/4 + 1;.    if(
a250: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
a260: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  ;.    pCol->szEs
a270: 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
a280: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
a290: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
a2a0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
a2b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
a2c0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
a2d0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
a2e0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
a2f0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a300: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
a310: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
a320: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
a330: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
a340: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
a350: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
a360: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
a370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a380: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
a390: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
a3a0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
a3b0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
a3c0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
a3d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
a3e0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a  ddDefaultValue(.
a3f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
a410: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
a420: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
a430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a440: 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65 73  he parsed expres
a450: 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61  sion of the defa
a460: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63  ult value */.  c
a470: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72  onst char *zStar
a480: 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  t,      /* Start
a490: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
a4a0: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20  value text */.  
a4b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64  const char *zEnd
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
a4d0: 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74  t character past
a4e0: 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76   end of defaut v
a4f0: 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a  alue text */.){.
a500: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
a510: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
a520: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a530: 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50  se->db;.  p = pP
a540: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
a550: 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20  .  if( p!=0 ){. 
a560: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
a570: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
a580: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
a590: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a5a0: 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c  rFunction(pExpr,
a5b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20   db->init.busy) 
a5c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a5d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a5e0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
a5f0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
a600: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
a610: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
a620: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
a630: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
a640: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
a650: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a660: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
a670: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
a680: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
a690: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
a6a0: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20  latile memory.. 
a6b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
a6c0: 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr x;.      sqli
a6d0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a6e0: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
a6f0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c        memset(&x,
a700: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
a710: 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f        x.op = TK_
a720: 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e  SPAN;.      x.u.
a730: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
a740: 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53  DbSpanDup(db, zS
a750: 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20  tart, zEnd);.   
a760: 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78     x.pLeft = pEx
a770: 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67  pr;.      x.flag
a780: 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20  s = EP_Skip;.   
a790: 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d     pCol->pDflt =
a7a0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a7b0: 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f  db, &x, EXPRDUP_
a7c0: 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73  REDUCE);.      s
a7d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a7e0: 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20   x.u.zToken);.  
a7f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e    }.  }.  if( IN
a800: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
a810: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
a820: 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61  ameExprUnmap(pPa
a830: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d  rse, pExpr);.  }
a840: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
a850: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
a860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61  .}../*.** Backwa
a870: 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74  rds Compatibilit
a880: 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48  y Hack:.** .** H
a890: 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f  istorical versio
a8a0: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63  ns of SQLite acc
a8b0: 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73  epted strings as
a8c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
a8d0: 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20  .** indexes and 
a8e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
a8f0: 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55  traints and in U
a900: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
a910: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
a920: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
a930: 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c  BLE xyz(a,b,c,d,
a940: 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61  e,PRIMARY KEY('a
a950: 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63  '),UNIQUE('b','c
a960: 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a  ' COLLATE trim).
a970: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e  **     CREATE IN
a980: 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27  DEX abc ON xyz('
a990: 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20  c','d' DESC,'e' 
a9a0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44  COLLATE nocase D
a9b0: 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ESC);.**.** This
a9c0: 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20   is goofy.  But 
a9d0: 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b  to preserve back
a9e0: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
a9f0: 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20  ity we continue 
aa00: 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e  to.** accept it.
aa10: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
aa20: 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  oes the necessar
aa30: 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49  y conversion.  I
aa40: 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68  t converts.** th
aa50: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76  e expression giv
aa60: 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65  en in its argume
aa70: 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52  nt from a TK_STR
aa80: 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44  ING into a TK_ID
aa90: 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65  .** if the expre
aaa0: 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20  ssion is just a 
aab0: 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61  TK_STRING with a
aac0: 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41  n optional COLLA
aad0: 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66  TE clause..** If
aae0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
aaf0: 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  is anything othe
ab00: 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47  r than TK_STRING
ab10: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
ab20: 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   is.** unchanged
ab30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ab40: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
ab50: 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  Id(Expr *p){.  i
ab60: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  f( p->op==TK_STR
ab70: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70  ING ){.    p->op
ab80: 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73   = TK_ID;.  }els
ab90: 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  e if( p->op==TK_
aba0: 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c  COLLATE && p->pL
abb0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  eft->op==TK_STRI
abc0: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65  NG ){.    p->pLe
abd0: 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a  ft->op = TK_ID;.
abe0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
abf0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
ac00: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
ac10: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
ac20: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
ac30: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
ac40: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
ac50: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
ac60: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
ac70: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
ac80: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
ac90: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
aca0: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
acb0: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
acc0: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
acd0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
ace0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
acf0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
ad00: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
ad10: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
ad20: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
ad30: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
ad40: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
ad50: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
ad60: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
ad70: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
ad80: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
ad90: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
ada0: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
adb0: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
adc0: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
add0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
ade0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
adf0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
ae00: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
ae10: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
ae20: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
ae30: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
ae40: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
ae50: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
ae60: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
ae70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ae80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
ae90: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
aea0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
aeb0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
aec0: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
aed0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
aee0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
aef0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
af00: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
af10: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
af20: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
af30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
af40: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
af50: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
af60: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
af70: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
af80: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
af90: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
afa0: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
afb0: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
afc0: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
afd0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
afe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
aff0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
b000: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
b010: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
b020: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
b030: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
b040: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
b050: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
b060: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b070: 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  Table;.  Column 
b080: 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
b090: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
b0a0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
b0b0: 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
b0c0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
b0d0: 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  t;.  if( pTab->t
b0e0: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73  abFlags & TF_Has
b0f0: 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20  PrimaryKey ){.  
b100: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b110: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
b120: 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68   "table \"%s\" h
b130: 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
b140: 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70   primary key", p
b150: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
b160: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
b170: 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54  y_exit;.  }.  pT
b180: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
b190: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
b1a0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
b1b0: 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
b1c0: 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20  Tab->nCol - 1;. 
b1d0: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
b1e0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
b1f0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
b200: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
b210: 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  EY;.    nTerm = 
b220: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b230: 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e  nTerm = pList->n
b240: 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Expr;.    for(i=
b250: 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
b260: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
b270: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
b280: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c  prSkipCollate(pL
b290: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
b2a0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b2b0: 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  pCExpr!=0 );.   
b2c0: 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
b2d0: 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20  ToId(pCExpr);.  
b2e0: 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e      if( pCExpr->
b2f0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
b300: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
b310: 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72  *zCName = pCExpr
b320: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
b330: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
b340: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
b350: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
b360: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
b370: 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70  trICmp(zCName, p
b380: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
b390: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
b3a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
b3b0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
b3c0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ];.            p
b3d0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
b3e0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
b3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
b400: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
b410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b420: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
b430: 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26  f( nTerm==1.   &
b440: 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c  & pCol.   && sql
b450: 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69  ite3StrICmp(sqli
b460: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43  te3ColumnType(pC
b470: 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52  ol,""), "INTEGER
b480: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
b490: 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f  Order!=SQLITE_SO
b4a0: 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69  _DESC.  ){.    i
b4b0: 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
b4c0: 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  ECT && pList ){.
b4d0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
b4e0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
b4f0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
b500: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
b510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
b520: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
b530: 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b  arse, &pTab->iPK
b540: 65 79 2c 20 70 43 45 78 70 72 29 3b 0a 20 20 20  ey, pCExpr);.   
b550: 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b   }.    pTab->iPK
b560: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
b570: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
b580: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
b590: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
b5a0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
b5b0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
b5c0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
b5d0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
b5e0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
b5f0: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
b600: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
b610: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
b620: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
b630: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
b640: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
b650: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
b660: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
b670: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
b680: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
b690: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
b6a0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
b6b0: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
b6c0: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
b6d0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b6e0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
b6f0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
b700: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
b730: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59   0, SQLITE_IDXTY
b740: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a  PE_PRIMARYKEY);.
b750: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
b760: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
b770: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
b780: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b790: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
b7a0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
b7b0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
b7c0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
b7d0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
b7e0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
b7f0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
b800: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
b810: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
b820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b830: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
b840: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
b850: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
b860: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
b870: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
b880: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b890: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
b8a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
b8b0: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33  Table;.  sqlite3
b8c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b8d0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  b;.  if( pTab &&
b8e0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
b8f0: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33  B.   && !sqlite3
b900: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
b910: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74  db->aDb[db->init
b920: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a  .iDb].pBt).  ){.
b930: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
b940: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
b950: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
b960: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70   pTab->pCheck, p
b970: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20  CheckExpr);.    
b980: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  if( pParse->cons
b990: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a  traintName.n ){.
b9a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b9b0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
b9c0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63  rse, pTab->pChec
b9d0: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73  k, &pParse->cons
b9e0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a  traintName, 1);.
b9f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65      }.  }else.#e
ba00: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
ba10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
ba20: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63  Parse->db, pChec
ba30: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  kExpr);.  }.}../
ba40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c  *.** Set the col
ba50: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
ba60: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
ba70: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c  ntly parsed tabl
ba80: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74  e column.** to t
ba90: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e  he CollSeq given
baa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bab0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
bac0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
bad0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
bae0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
baf0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   i;.  char *zCol
bb00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
bb10: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65  /* Dequoted name
bb20: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   of collation se
bb30: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69  quence */.  sqli
bb40: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
bb50: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
bb60: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
bb70: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43  urn;.  i = p->nC
bb80: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61  ol-1;.  db = pPa
bb90: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c  rse->db;.  zColl
bba0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
bbb0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
bbc0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c  en);.  if( !zCol
bbd0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  l ) return;..  i
bbe0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  f( sqlite3Locate
bbf0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
bc00: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e  zColl) ){.    In
bc10: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73  dex *pIdx;.    s
bc20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
bc30: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
bc40: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  l);.    p->aCol[
bc50: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
bc60: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
bc70: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
bc80: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
bc90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
bca0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
bcb0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
bcc0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
bcd0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
bce0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
bcf0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
bd00: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
bd10: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
bd20: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
bd30: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
bd40: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
bd50: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
bd60: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
bd70: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
bd80: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20  nKeyCol==1 );.  
bd90: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
bda0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
bdb0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
bdc0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
bdd0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
bde0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
bdf0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
be00: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
be10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
be20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
be30: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
be40: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
be50: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
be60: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
be70: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
be80: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
be90: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
bea0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
beb0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
bec0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
bed0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
bee0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
bef0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
bf00: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
bf10: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
bf20: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
bf30: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
bf40: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
bf50: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
bf60: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
bf70: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
bf80: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
bf90: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
bfa0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
bfb0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
bfc0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
bfd0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
bfe0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
bff0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
c000: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
c010: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
c020: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
c030: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
c040: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
c050: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
c060: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
c070: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
c080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
c090: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
c0a0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
c0b0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
c0c0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
c0d0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
c0e0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
c0f0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
c100: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
c110: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
c120: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c130: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
c140: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  : sqlite3FindCol
c150: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47  lSeq(), sqlite3G
c160: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43  etCollSeq().*/.C
c170: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
c180: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
c190: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
c1a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
c1b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c1c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38  pParse->db;.  u8
c1d0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
c1e0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20    u8 initbusy = 
c1f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20  db->init.busy;. 
c200: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
c210: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
c220: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
c230: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69  b, enc, zName, i
c240: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20  nitbusy);.  if( 
c250: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70  !initbusy && (!p
c260: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e  Coll || !pColl->
c270: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f  xCmp) ){.    pCo
c280: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
c290: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65  ollSeq(pParse, e
c2a0: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65  nc, pColl, zName
c2b0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
c2c0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pColl;.}.../*.*
c2d0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c2e0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d  that will increm
c2f0: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  ent the schema c
c300: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ookie..**.** The
c310: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69   schema cookie i
c320: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
c330: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68  ine when the sch
c340: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64  ema for the.** d
c350: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
c360: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68    After each sch
c370: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20  ema change, the 
c380: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20  cookie value.** 
c390: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61  changes.  When a
c3a0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72   process first r
c3b0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20  eads the schema 
c3c0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a  it records the.*
c3d0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65  * cookie.  There
c3e0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20  after, whenever 
c3f0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73  it goes to acces
c400: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a  s the database,.
c410: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65  ** it checks the
c420: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20   cookie to make 
c430: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20  sure the schema 
c440: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a  has not changed.
c450: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ** since it was 
c460: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  last read..**.**
c470: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f   This plan is no
c480: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c  t completely bul
c490: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69  let-proof.  It i
c4a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a  s possible for.*
c4b0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
c4c0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20  change multiple 
c4d0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68  times and for th
c4e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a  e cookie to be.*
c4f0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72  * set back to pr
c500: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20  ior value.  But 
c510: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61  schema changes a
c520: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a  re infrequent.**
c530: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69   and the probabi
c540: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20  lity of hitting 
c550: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20  the same cookie 
c560: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a  value is only.**
c570: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33   1 chance in 2^3
c580: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66  2.  So we're saf
c590: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20  e enough..**.** 
c5a0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
c5b0: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39  F: R-34230-56049
c5c0: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
c5d0: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73  cally increments
c5e0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76  .** the schema-v
c5f0: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20  ersion whenever 
c600: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  the schema chang
c610: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
c620: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
c630: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
c640: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74  nt iDb){.  sqlit
c650: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c660: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  >db;.  Vdbe *v =
c670: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
c680: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c690: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
c6a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
c6b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c6c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
c6d0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
c6e0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
c6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c700: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73      (int)(1+(uns
c710: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44  igned)db->aDb[iD
c720: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
c730: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a  ma_cookie));.}..
c740: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68  /*.** Measure th
c750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
c760: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f  acters needed to
c770: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   output the give
c780: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e  n.** identifier.
c790: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74    The number ret
c7a0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61  urned includes a
c7b0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a  ny quotes used.*
c7c0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69  * but does not i
c7d0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20  nclude the null 
c7e0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a  terminator..**.*
c7f0: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69  * The estimate i
c800: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20  s conservative. 
c810: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72   It might be lar
c820: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73  ger that what is
c830: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65  .** really neede
c840: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
c850: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e   identLength(con
c860: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
c870: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
c880: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a   *z; n++, z++){.
c890: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20      if( *z=='"' 
c8a0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  ){ n++; }.  }.  
c8b0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a  return n + 2;.}.
c8c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
c8d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
c8e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75  pointer to an ou
c8f0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65  tput buffer. The
c900: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61   second .** para
c910: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
c920: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
c930: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c940: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20  he offset at.** 
c950: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69  which to write i
c960: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
c970: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
c980: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a  tion copies the.
c990: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  ** nul-terminate
c9a0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64  d string pointed
c9b0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64   to by the third
c9c0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67   parameter, zSig
c9d0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20  nedIdent,.** to 
c9e0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66  the specified of
c9f0: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66  fset in the buff
ca00: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a  er and updates *
ca10: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a  pIdx to refer.**
ca20: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
ca30: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  te after the las
ca40: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62  t byte written b
ca50: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
ca60: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73  .** .** If the s
ca70: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65  tring zSignedIde
ca80: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  nt consists enti
ca90: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75  rely of alpha-nu
caa0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74  meric.** charact
cab0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65  ers, does not be
cac0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74  gin with a digit
cad0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53   and is not an S
cae0: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74  QL keyword,.** t
caf0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
cb00: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62   to the output b
cb10: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73  uffer exactly as
cb20: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73   it is. Otherwis
cb30: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74  e,.** it is quot
cb40: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d  ed using double-
cb50: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  quotes..*/.stati
cb60: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28  c void identPut(
cb70: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49  char *z, int *pI
cb80: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65  dx, char *zSigne
cb90: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67  dIdent){.  unsig
cba0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74  ned char *zIdent
cbb0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
cbc0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b  r*)zSignedIdent;
cbd0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65  .  int i, j, nee
cbe0: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70  dQuote;.  i = *p
cbf0: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  Idx;..  for(j=0;
cc00: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
cc10: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  {.    if( !sqlit
cc20: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74  e3Isalnum(zIdent
cc30: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a  [j]) && zIdent[j
cc40: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a  ]!='_' ) break;.
cc50: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20    }.  needQuote 
cc60: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  = sqlite3Isdigit
cc70: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20  (zIdent[0]).    
cc80: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
cc90: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49  e3KeywordCode(zI
cca0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a  dent, j)!=TK_ID.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a              || z
ccc0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20  Ident[j]!=0.    
ccd0: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b          || j==0;
cce0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
ccf0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
cd00: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
cd10: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
cd20: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
cd30: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
cd40: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
cd50: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
cd60: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
cd70: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
cd80: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
cd90: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
cda0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
cdb0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
cdc0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
cdd0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
cde0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
cdf0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
ce00: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
ce10: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
ce20: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
ce30: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
ce40: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
ce50: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
ce60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
ce70: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
ce80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
ce90: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
cea0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
ceb0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
cec0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
ced0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
cee0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
cef0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
cf00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
cf10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
cf20: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
cf30: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
cf40: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
cf50: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
cf60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
cf70: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
cf80: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
cf90: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
cfa0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
cfb0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
cfc0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
cfd0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
cfe0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
cff0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
d000: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
d010: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d020: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
d030: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
d040: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
d050: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
d060: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d070: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
d080: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
d090: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
d0a0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
d0b0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
d0c0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
d0d0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
d0e0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
d0f0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
d100: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
d110: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
d120: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d130: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
d140: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
d150: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  * SQLITE_AFF_BLO
d160: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20  B    */ "",.    
d170: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
d180: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54  F_TEXT    */ " T
d190: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  EXT",.        /*
d1a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
d1b0: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
d1c0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
d1d0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
d1e0: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
d1f0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
d200: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
d210: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
d220: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
d230: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
d240: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d250: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
d260: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
d270: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d280: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
d290: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
d2a0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
d2b0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
d2c0: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
d2d0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d2e0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  -SQLITE_AFF_BLOB
d2f0: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
d300: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
d310: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
d320: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28  LOB < ArraySize(
d330: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
d340: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
d350: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d360: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20  AFF_BLOB );.    
d370: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
d380: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
d390: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
d3a0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d3b0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3c0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
d3d0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d3e0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d3f0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
d400: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
d410: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
d420: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
d430: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
d440: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
d450: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
d460: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b  QLITE_AFF_BLOB];
d470: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
d480: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
d490: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d4a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d4b0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a  QLITE_AFF_BLOB .
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
d4d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
d4e0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
d4f0: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
d500: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
d510: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
d520: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
d530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
d540: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
d550: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d560: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
d570: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
d580: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
d590: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
d5a0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
d5b0: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
d5c0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d5d0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
d5e0: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
d5f0: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
d600: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
d610: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
d620: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
d630: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
d640: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
d650: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
d660: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
d670: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
d680: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d690: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
d6a0: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
d6b0: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
d6c0: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
d6d0: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
d6e0: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
d6f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d700: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
d710: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
d720: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
d730: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  PT;.  memcpy(zEx
d740: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
d750: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
d760: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
d770: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
d780: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
d790: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
d7a0: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a   += sizeof(char*
d7b0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
d7c0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f  xtra, pIdx->aiCo
d7d0: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36  lumn, sizeof(i16
d7e0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  )*pIdx->nColumn)
d7f0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ;.  pIdx->aiColu
d800: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72  mn = (i16*)zExtr
d810: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73  a;.  zExtra += s
d820: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20  izeof(i16)*N;.  
d830: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d840: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  Idx->aSortOrder,
d850: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b   pIdx->nColumn);
d860: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  .  pIdx->aSortOr
d870: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72  der = (u8*)zExtr
d880: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  a;.  pIdx->nColu
d890: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e  mn = N;.  pIdx->
d8a0: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20  isResized = 1;. 
d8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d8c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  K;.}../*.** Esti
d8d0: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72  mate the total r
d8e0: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74  ow width for a t
d8f0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
d900: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62  void estimateTab
d910: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70  leWidth(Table *p
d920: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Tab){.  unsigned
d930: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63   wTable = 0;.  c
d940: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61  onst Column *pTa
d950: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  bCol;.  int i;. 
d960: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f   for(i=pTab->nCo
d970: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  l, pTabCol=pTab-
d980: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c  >aCol; i>0; i--,
d990: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20   pTabCol++){.   
d9a0: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43   wTable += pTabC
d9b0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  ol->szEst;.  }. 
d9c0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d9d0: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20  <0 ) wTable++;. 
d9e0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
d9f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
da00: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wTable*4);.}../*
da10: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
da20: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66   average size of
da30: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e   a row for an in
da40: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
da50: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65  oid estimateInde
da60: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49  xWidth(Index *pI
da70: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
da80: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e  wIndex = 0;.  in
da90: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t i;.  const Col
daa0: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78  umn *aCol = pIdx
dab0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a  ->pTable->aCol;.
dac0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
dad0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
dae0: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49  {.    i16 x = pI
daf0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
db00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70  .    assert( x<p
db10: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f  Idx->pTable->nCo
db20: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20  l );.    wIndex 
db30: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f  += x<0 ? 1 : aCo
db40: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
db50: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a  [i]].szEst;.  }.
db60: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77    pIdx->szIdxRow
db70: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
db80: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f  (wIndex*4);.}../
db90: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
dba0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 78   column number x
dbb0: 20 69 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66   is any of the f
dbc0: 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65  irst nCol entrie
dbd0: 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 2e 0a 2a 2a  s of aiCol[]..**
dbe0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
dbf0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
dc00: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
dc10: 78 20 61 70 70 65 61 72 73 20 69 6e 20 61 6e 79  x appears in any
dc20: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
dc30: 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66   nCol entries of
dc40: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
dc50: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75  atic int hasColu
dc60: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69  mn(const i16 *ai
dc70: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69  Col, int nCol, i
dc80: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt x){.  while( 
dc90: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  nCol-- > 0 ){.  
dca0: 20 20 61 73 73 65 72 74 28 20 61 69 43 6f 6c 5b    assert( aiCol[
dcb0: 30 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]>=0 );.    if(
dcc0: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29   x==*(aiCol++) )
dcd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
dce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
dcf0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
dd00: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
dd10: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  any of the first
dd20: 20 6e 4b 65 79 20 65 6e 74 72 69 65 73 20 6f 66   nKey entries of
dd30: 20 69 6e 64 65 78 20 70 49 64 78 20 65 78 61 63   index pIdx exac
dd40: 74 6c 79 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65  tly.** match the
dd50: 20 69 43 6f 6c 2d 74 68 20 65 6e 74 72 79 20 6f   iCol-th entry o
dd60: 66 20 70 50 6b 2e 20 20 70 50 6b 20 69 73 20 61  f pPk.  pPk is a
dd70: 6c 77 61 79 73 20 61 20 57 49 54 48 4f 55 54 20  lways a WITHOUT 
dd80: 52 4f 57 49 44 0a 2a 2a 20 50 52 49 4d 41 52 59  ROWID.** PRIMARY
dd90: 20 4b 45 59 20 69 6e 64 65 78 2e 20 20 70 49 64   KEY index.  pId
dda0: 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  x is an index on
ddb0: 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
ddc0: 20 20 70 49 64 78 20 6d 61 79 0a 2a 2a 20 6f 72    pIdx may.** or
ddd0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
dde0: 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 70 50  same index as pP
ddf0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  k..**.** The fir
de00: 73 74 20 6e 4b 65 79 20 65 6e 74 72 69 65 73 20  st nKey entries 
de10: 6f 66 20 70 49 64 78 20 61 72 65 20 67 75 61 72  of pIdx are guar
de20: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6f 72 64  anteed to be ord
de30: 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 73 2c 0a 2a  inary columns,.*
de40: 2a 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 6f 72  * not a rowid or
de50: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
de60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
de70: 64 69 66 66 65 72 73 20 66 72 6f 6d 20 68 61 73  differs from has
de80: 43 6f 6c 75 6d 6e 28 29 20 69 6e 20 74 68 61 74  Column() in that
de90: 20 62 6f 74 68 20 74 68 65 20 63 6f 6c 75 6d 6e   both the column
dea0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c   and the.** coll
deb0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d  ating sequence m
dec0: 75 73 74 20 6d 61 74 63 68 20 66 6f 72 20 74 68  ust match for th
ded0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 62 75 74 20  is routine, but 
dee0: 66 6f 72 20 68 61 73 43 6f 6c 75 6d 6e 28 29 20  for hasColumn() 
def0: 6f 6e 6c 79 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  only.** the colu
df00: 6d 6e 20 6e 61 6d 65 20 6d 75 73 74 20 6d 61 74  mn name must mat
df10: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ch..*/.static in
df20: 74 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 49 6e  t isDupColumn(In
df30: 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 6e  dex *pIdx, int n
df40: 4b 65 79 2c 20 49 6e 64 65 78 20 2a 70 50 6b 2c  Key, Index *pPk,
df50: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   int iCol){.  in
df60: 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74  t i, j;.  assert
df70: 28 20 6e 4b 65 79 3c 3d 70 49 64 78 2d 3e 6e 43  ( nKey<=pIdx->nC
df80: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
df90: 74 28 20 69 43 6f 6c 3c 4d 41 58 28 70 50 6b 2d  t( iCol<MAX(pPk-
dfa0: 3e 6e 43 6f 6c 75 6d 6e 2c 70 50 6b 2d 3e 6e 4b  >nColumn,pPk->nK
dfb0: 65 79 43 6f 6c 29 20 29 3b 0a 20 20 61 73 73 65  eyCol) );.  asse
dfc0: 72 74 28 20 70 50 6b 2d 3e 69 64 78 54 79 70 65  rt( pPk->idxType
dfd0: 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ==SQLITE_IDXTYPE
dfe0: 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 3b 0a 20  _PRIMARYKEY );. 
dff0: 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 70 54   assert( pPk->pT
e000: 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26  able->tabFlags &
e010: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
e020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e030: 6b 2d 3e 70 54 61 62 6c 65 3d 3d 70 49 64 78 2d  k->pTable==pIdx-
e040: 3e 70 54 61 62 6c 65 20 29 3b 0a 20 20 74 65 73  >pTable );.  tes
e050: 74 63 61 73 65 28 20 70 50 6b 3d 3d 70 49 64 78  tcase( pPk==pIdx
e060: 20 29 3b 0a 20 20 6a 20 3d 20 70 50 6b 2d 3e 61   );.  j = pPk->a
e070: 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20  iColumn[iCol];. 
e080: 20 61 73 73 65 72 74 28 20 6a 21 3d 58 4e 5f 52   assert( j!=XN_R
e090: 4f 57 49 44 20 26 26 20 6a 21 3d 58 4e 5f 45 58  OWID && j!=XN_EX
e0a0: 50 52 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  PR );.  for(i=0;
e0b0: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
e0c0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
e0d0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
e0e0: 7c 7c 20 6a 3e 3d 30 20 29 3b 0a 20 20 20 20 69  || j>=0 );.    i
e0f0: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
e100: 6e 5b 69 5d 3d 3d 6a 20 0a 20 20 20 20 20 26 26  n[i]==j .     &&
e110: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e120: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c  pIdx->azColl[i],
e130: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f   pPk->azColl[iCo
e140: 6c 5d 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  l])==0.    ){.  
e150: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
e160: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e170: 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70   0;.}../* Recomp
e180: 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64  ute the colNotId
e190: 78 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  xed field of the
e1a0: 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f   Index..**.** co
e1b0: 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62  lNotIdxed is a b
e1c0: 69 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20  itmask that has 
e1d0: 61 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e  a 0 bit represen
e1e0: 74 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65  ting each indexe
e1f0: 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61  d.** columns tha
e200: 74 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  t are within the
e210: 20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e   first 63 column
e220: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  s of the table. 
e230: 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64   The.** high-ord
e240: 65 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74  er bit of colNot
e250: 49 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20  Idxed is always 
e260: 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65  1.  All unindexe
e270: 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  d columns.** of 
e280: 74 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61  the table have a
e290: 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f   1..**.** The co
e2a0: 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69  lNotIdxed mask i
e2b0: 73 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68  s AND-ed with th
e2c0: 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f  e SrcList.a[].co
e2d0: 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f  lUsed mask.** to
e2e0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
e2f0: 65 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72  e index is cover
e300: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ing index..*/.st
e310: 61 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70  atic void recomp
e320: 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64  uteColumnsNotInd
e330: 65 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78  exed(Index *pIdx
e340: 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d  ){.  Bitmask m =
e350: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66   0;.  int j;.  f
e360: 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  or(j=pIdx->nColu
e370: 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29  mn-1; j>=0; j--)
e380: 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49  {.    int x = pI
e390: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
e3a0: 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b  .    if( x>=0 ){
e3b0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
e3c0: 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20   x==BMS-1 );.   
e3d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
e3e0: 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69  BMS-2 );.      i
e3f0: 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c  f( x<BMS-1 ) m |
e400: 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20  = MASKBIT(x);.  
e410: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e    }.  }.  pIdx->
e420: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d  colNotIdxed = ~m
e430: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
e440: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e  x->colNotIdxed>>
e450: 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a  63)==1 );.}../*.
e460: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e470: 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20  runs at the end 
e480: 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  of parsing a CRE
e490: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e4a0: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  ent that.** has 
e4b0: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
e4c0: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62  clause.  The job
e4d0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
e4e0: 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62   is to convert b
e4f0: 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  oth.** internal 
e500: 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75  schema data stru
e510: 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67  ctures and the g
e520: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
e530: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a  de so that they.
e540: 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ** are appropria
e550: 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  te for a WITHOUT
e560: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73   ROWID table ins
e570: 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20  tead of a rowid 
e580: 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65  table..** Change
e590: 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  s include:.**.**
e5a0: 20 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c       (1)  Set al
e5b0: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
e5c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68   PRIMARY KEY sch
e5d0: 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  ema object to be
e5e0: 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20   NOT NULL..**   
e5f0: 20 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50    (2)  Convert P
e600: 33 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74  3 parameter of t
e610: 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  he OP_CreateBtre
e620: 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54  e from BTREE_INT
e630: 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  KEY .**         
e640: 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42   into BTREE_BLOB
e650: 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  KEY..**     (3) 
e660: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
e670: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
e680: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
e690: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
e6a0: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
e6b0: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
e6c0: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
e6d0: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
e6e0: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
e6f0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e700: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
e710: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
e720: 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  f..**     (4)  S
e730: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
e740: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
e750: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e760: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
e770: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
e780: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
e790: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
e7a0: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
e7b0: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
e7c0: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
e7d0: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
e7e0: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
e7f0: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
e800: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
e810: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
e820: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
e830: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
e840: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
e850: 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61  .nAllField and a
e860: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
e870: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
e880: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
e890: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
e8a0: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
e8b0: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
e8c0: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
e8d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
e8e0: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
e8f0: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
e900: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
e910: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
e920: 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c  *.** For virtual
e930: 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31   tables, only (1
e940: 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  ) is performed..
e950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
e960: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
e970: 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20  owidTable(Parse 
e980: 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
e990: 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a  pTab){.  Index *
e9a0: 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pIdx;.  Index *p
e9b0: 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20  Pk;.  int nPk;. 
e9c0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
e9d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e9e0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
e9f0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ea00: 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65  ;..  /* Mark eve
ea10: 72 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ry PRIMARY KEY c
ea20: 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c  olumn as NOT NUL
ea30: 4c 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d  L (except for im
ea40: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20  poster tables). 
ea50: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
ea60: 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
ea70: 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e ){.    for(i=0
ea80: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
ea90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
eaa0: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63  (pTab->aCol[i].c
eab0: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
eac0: 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b  G_PRIMKEY)!=0 ){
ead0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61  .        pTab->a
eae0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
eaf0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20   OE_Abort;.     
eb00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
eb10: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50  /* Convert the P
eb20: 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  3 operand of the
eb30: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20   OP_CreateBtree 
eb40: 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45  opcode from BTRE
eb50: 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e  E_INTKEY.  ** in
eb60: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
eb70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
eb80: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29  rse->addrCrTab )
eb90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20  {.    assert( v 
eba0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ebb0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50  beChangeP3(v, pP
ebc0: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c  arse->addrCrTab,
ebd0: 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b   BTREE_BLOBKEY);
ebe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
ebf0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
ec00: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
ec10: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
ec20: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
ec30: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
ec40: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
ec50: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
ec60: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
ec70: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
ec80: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
ec90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
eca0: 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f  .    Token ipkTo
ecb0: 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ken;.    sqlite3
ecc0: 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f  TokenInit(&ipkTo
ecd0: 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ken, pTab->aCol[
ece0: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
ecf0: 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
ed00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ed10: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
ed20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
ed30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ed40: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
ed50: 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b   &ipkToken, 0));
ed60: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
ed70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ed80: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
ed90: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 73 71  JECT ){.      sq
eda0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
edb0: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 70 4c  Remap(pParse, pL
edc0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
edd0: 20 26 70 54 61 62 2d 3e 69 50 4b 65 79 29 3b 0a   &pTab->iPKey);.
ede0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
edf0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
ee00: 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  = pParse->iPkSor
ee10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65  tOrder;.    asse
ee20: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
ee30: 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20  Table==pTab );. 
ee40: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
ee50: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
ee60: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
ee70: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
ee80: 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e  st, pTab->keyCon
ee90: 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  f, 0, 0, 0, 0,. 
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58        SQLITE_IDX
eec0: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29  TYPE_PRIMARYKEY)
eed0: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
eee0: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
eef0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
ef00: 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  urn;.    pPk = s
ef10: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
ef20: 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d  Index(pTab);.  }
ef30: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20  else{.    pPk = 
ef40: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
ef50: 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
ef60: 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30    assert( pPk!=0
ef70: 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
ef80: 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65  ** Remove all re
ef90: 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20  dundant columns 
efa0: 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59  from the PRIMARY
efb0: 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70   KEY.  For examp
efc0: 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a  le, change.    *
efd0: 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61  * "PRIMARY KEY(a
efe0: 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22  ,b,a,b,c,b,c,d)"
eff0: 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d   into just "PRIM
f000: 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29  ARY KEY(a,b,c,d)
f010: 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a  ".  Later.    **
f020: 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68   code assumes th
f030: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
f040: 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74  ntains no repeat
f050: 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ed columns..    
f060: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31  */.    for(i=j=1
f070: 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; i<pPk->nKeyCol
f080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f090: 28 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 50  ( isDupColumn(pP
f0a0: 6b 2c 20 6a 2c 20 70 50 6b 2c 20 69 29 20 29 7b  k, j, pPk, i) ){
f0b0: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43  .        pPk->nC
f0c0: 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d  olumn--;.      }
f0d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
f0e0: 73 74 63 61 73 65 28 20 68 61 73 43 6f 6c 75 6d  stcase( hasColum
f0f0: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
f100: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
f110: 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20 20 20 20  n[i]) );.       
f120: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
f130: 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  ++] = pPk->aiCol
f140: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  umn[i];.      }.
f150: 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e      }.    pPk->n
f160: 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a  KeyCol = j;.  }.
f170: 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30    assert( pPk!=0
f180: 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76   );.  pPk->isCov
f190: 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28  ering = 1;.  if(
f1a0: 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73   !db->init.impos
f1b0: 74 65 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e  terTable ) pPk->
f1c0: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  uniqNotNull = 1;
f1d0: 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b  .  nPk = pPk->nK
f1e0: 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70  eyCol;..  /* Byp
f1f0: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
f200: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
f210: 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68  KEY btree and th
f220: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
f230: 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79    ** table entry
f240: 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72  . This is only r
f250: 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72 65  equired if curre
f260: 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20  ntly generating 
f270: 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66  VDBE.  ** code f
f280: 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  or a CREATE TABL
f290: 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73  E (not when pars
f2a0: 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20  ing one as part 
f2b0: 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20  of reading.  ** 
f2c0: 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
f2d0: 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20  a).  */.  if( v 
f2e0: 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29  && pPk->tnum>0 )
f2f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
f300: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
f310: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f320: 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c  eChangeOpcode(v,
f330: 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47   pPk->tnum, OP_G
f340: 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  oto);.  }..  /* 
f350: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
f360: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f370: 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f   is the table ro
f380: 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b  ot page */.  pPk
f390: 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74  ->tnum = pTab->t
f3a0: 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74  num;..  /* Updat
f3b0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
f3c0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
f3d0: 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64  f all UNIQUE ind
f3e0: 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69  ices by converti
f3f0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  ng.  ** the fina
f400: 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69  l rowid column i
f410: 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
f420: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
f430: 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f  RIMARY KEY..  */
f440: 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62  .  for(pIdx=pTab
f450: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
f460: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
f470: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
f480: 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b    if( IsPrimaryK
f490: 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20  eyIndex(pIdx) ) 
f4a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
f4b0: 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20  r(i=n=0; i<nPk; 
f4c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f4d0: 21 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 49 64  !isDupColumn(pId
f4e0: 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
f4f0: 2c 20 70 50 6b 2c 20 69 29 20 29 7b 0a 20 20 20  , pPk, i) ){.   
f500: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 68       testcase( h
f510: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
f520: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
f530: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
f540: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20 20  olumn[i]) );.   
f550: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
f560: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f570: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  n==0 ){.      /*
f580: 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   This index is a
f590: 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65   superset of the
f5a0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
f5b0: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c        pIdx->nCol
f5c0: 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  umn = pIdx->nKey
f5d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Col;.      conti
f5e0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
f5f0: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
f600: 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70  ject(db, pIdx, p
f610: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20  Idx->nKeyCol+n) 
f620: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
f630: 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e  r(i=0, j=pIdx->n
f640: 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69  KeyCol; i<nPk; i
f650: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
f660: 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 49 64 78  isDupColumn(pIdx
f670: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c  , pIdx->nKeyCol,
f680: 20 70 50 6b 2c 20 69 29 20 29 7b 0a 20 20 20 20   pPk, i) ){.    
f690: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 68 61      testcase( ha
f6a0: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
f6b0: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
f6c0: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
f6d0: 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a 20 20 20 20  lumn[i]) );.    
f6e0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
f6f0: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
f700: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
f710: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
f720: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
f730: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
f740: 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  pPk->aSortOrder[
f750: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
f760: 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 68 74  /* See ticket ht
f770: 74 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65  tps://www.sqlite
f780: 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 62 62  .org/src/info/bb
f790: 61 37 62 36 39 66 39 38 34 39 62 35 62 66 20 2a  a7b69f9849b5bf *
f7a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  /.          pIdx
f7b0: 2d 3e 62 41 73 63 4b 65 79 42 75 67 20 3d 20 31  ->bAscKeyBug = 1
f7c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f7d0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
f7e0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
f7f0: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
f800: 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  >=pIdx->nKeyCol+
f810: 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n );.    assert(
f820: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
f830: 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  j );.  }..  /* A
f840: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
f850: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
f860: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
f870: 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61  */.  if( nPk<pTa
f880: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69  b->nCol ){.    i
f890: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
f8a0: 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54  ject(db, pPk, pT
f8b0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75  ab->nCol) ) retu
f8c0: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
f8d0: 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e   j=nPk; i<pTab->
f8e0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f8f0: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
f900: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
f910: 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  j, i) ){.       
f920: 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
f930: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
f940: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
f950: 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  [j] = i;.       
f960: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
f970: 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
f980: 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  RY;.        j++;
f990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f9a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
f9b0: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
f9c0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
f9d0: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
f9e0: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
f9f0: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
fa00: 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70 75  l;.  }.  recompu
fa10: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
fa20: 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 23 69 66  xed(pPk);.}..#if
fa30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fa40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
fa50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
fa60: 69 66 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68  if zName is a sh
fa70: 61 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65 20  adow table name 
fa80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
fa90: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
faa0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61  ction..**.** zNa
fab0: 6d 65 20 69 73 20 74 65 6d 70 6f 72 61 72 69 6c  me is temporaril
fac0: 79 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  y modified while
fad0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fae0: 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74 20 69 73   running, but is
faf0: 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20 74 6f 20  .** restored to 
fb00: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  its original val
fb10: 75 65 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ue prior to this
fb20: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 69   routine returni
fb30: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
fb40: 74 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  t isShadowTableN
fb50: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
fb60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
fb70: 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b 20 20 20   char *zTail;   
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb90: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
fba0: 20 6c 61 73 74 20 22 5f 22 20 69 6e 20 7a 4e 61   last "_" in zNa
fbb0: 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
fbc0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
fbd0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
fbe0: 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 73  hat zName is a s
fbf0: 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20 20 4d 6f  hadow of */.  Mo
fc00: 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20 20 20 20  dule *pMod;     
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
fc20: 6f 64 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69  odule for the vi
fc30: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a  rtual table */..
fc40: 20 20 7a 54 61 69 6c 20 3d 20 73 74 72 72 63 68    zTail = strrch
fc50: 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29 3b 0a 20  r(zName, '_');. 
fc60: 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20   if( zTail==0 ) 
fc70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 7a 54 61  return 0;.  *zTa
fc80: 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 20 3d  il = 0;.  pTab =
fc90: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
fca0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  e(db, zName, 0);
fcb0: 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27 5f 27 3b  .  *zTail = '_';
fcc0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
fcd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fce0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
fcf0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
fd00: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
fd10: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
fd20: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 70 54  &db->aModule, pT
fd30: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
fd40: 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 3d  0]);.  if( pMod=
fd50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
fd60: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75   if( pMod->pModu
fd70: 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c 33 20 29  le->iVersion<3 )
fd80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
fd90: 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e   pMod->pModule->
fda0: 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d 30 20 29  xShadowName==0 )
fdb0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
fdc0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  urn pMod->pModul
fdd0: 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 28 7a  e->xShadowName(z
fde0: 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65 6c 73 65  Tail+1);.}.#else
fdf0: 0a 23 20 64 65 66 69 6e 65 20 69 73 53 68 61 64  .# define isShad
fe00: 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78 2c 79 29  owTableName(x,y)
fe10: 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e   0.#endif /* ifn
fe20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fe30: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
fe40: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fe50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
fe60: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
fe70: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
fe80: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
fe90: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
fea0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
feb0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
fec0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
fed0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
fee0: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
fef0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
ff00: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
ff10: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
ff20: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
ff30: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
ff40: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
ff50: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
ff60: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
ff70: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
ff80: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
ff90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
ffa0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
ffb0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
ffc0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
ffd0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
ffe0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
fff0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
10000 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
10010 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
10020 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
10030 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
10040 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
10050 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
10060 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
10070 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
10080 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
10090 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
100a0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
100b0 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
100c0 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
100d0 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
100e0 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
100f0 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
10100 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
10110 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
10120 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
10130 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
10140 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
10150 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
10160 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
10170 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
10180 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
10190 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
101a0 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
101b0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
101c0 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
101d0 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
101e0 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
101f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
10200 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
10210 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
10220 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
10230 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
10240 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
10250 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
10260 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
10270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27        /* The ')'
10280 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20   before options 
10290 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
102a0 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f  BLE */.  u8 tabO
102b0 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  pts,            
102c0 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20   /* Extra table 
102d0 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79  options. Usually
102e0 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   0. */.  Select 
102f0 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
10300 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
10310 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
10320 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
10330 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20   Table *p;      
10340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10350 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
10360 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
10370 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
10380 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10390 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
103a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
103b0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
103c0 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61   in which the ta
103d0 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49  ble lives */.  I
103e0 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
103f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
10400 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20  mplied index of 
10410 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
10420 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70  if( pEnd==0 && p
10430 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
10440 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
10450 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
10460 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20  ocFailed );.  p 
10470 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
10480 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
10490 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
104a0 20 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69   pSelect==0 && i
104b0 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
104c0 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29  (db, p->zName) )
104d0 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67  {.    p->tabFlag
104e0 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a  s |= TF_Shadow;.
104f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10500 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
10510 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
10520 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
10530 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
10540 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
10550 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
10560 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
10570 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
10580 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
10590 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
105a0 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
105b0 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
105c0 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
105d0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
105e0 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
105f0 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
10600 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
10610 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
10620 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
10630 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
10640 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine.).  **.  ** 
10650 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
10660 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68   number is 1, th
10670 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73  at means this is
10680 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
10690 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74  er.  ** table it
106a0 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69  self.  So mark i
106b0 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a  t read-only..  *
106c0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
106d0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28  .busy ){.    if(
106e0 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
106f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10700 67 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20  g(pParse, "");. 
10710 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10720 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d   }.    p->tnum =
10730 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
10740 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e  m;.    if( p->tn
10750 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c  um==1 ) p->tabFl
10760 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e  ags |= TF_Readon
10770 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ly;.  }..  asser
10780 74 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  t( (p->tabFlags 
10790 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
107a0 65 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c  ey)==0.       ||
107b0 20 70 2d 3e 69 50 4b 65 79 3e 3d 30 20 7c 7c 20   p->iPKey>=0 || 
107c0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
107d0 79 49 6e 64 65 78 28 70 29 21 3d 30 20 29 3b 0a  yIndex(p)!=0 );.
107e0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 74 61    assert( (p->ta
107f0 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
10800 72 69 6d 61 72 79 4b 65 79 29 21 3d 30 0a 20 20  rimaryKey)!=0.  
10810 20 20 20 20 20 7c 7c 20 28 70 2d 3e 69 50 4b 65       || (p->iPKe
10820 79 3c 30 20 26 26 20 73 71 6c 69 74 65 33 50 72  y<0 && sqlite3Pr
10830 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
10840 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 70  ==0) );..  /* Sp
10850 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
10860 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
10870 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
10880 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
10890 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
108a0 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
108b0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
108c0 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
108d0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
108e0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
108f0 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
10900 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
10910 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
10920 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
10930 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
10940 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
10950 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
10960 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
10970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10980 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
10990 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
109a0 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
109b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
109c0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
109d0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
109e0 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f  outRowid | TF_No
109f0 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
10a00 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74      convertToWit
10a10 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70  houtRowidTable(p
10a20 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
10a30 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71  .  }..  iDb = sq
10a40 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
10a50 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
10a60 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
10a70 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
10a80 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
10a90 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
10aa0 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
10ab0 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
10ac0 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
10ad0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
10ae0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
10af0 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43  Parse, p, NC_IsC
10b00 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65  heck, 0, p->pChe
10b10 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ck);.  }.#endif 
10b20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10b30 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
10b40 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  /..  /* Estimate
10b50 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77   the average row
10b60 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61   size for the ta
10b70 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20  ble and for all 
10b80 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20  implied indices 
10b90 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62  */.  estimateTab
10ba0 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f  leWidth(p);.  fo
10bb0 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
10bc0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10bd0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65  x->pNext){.    e
10be0 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
10bf0 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20  h(pIdx);.  }..  
10c00 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
10c10 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
10c20 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
10c30 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
10c40 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
10c50 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
10c60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
10c70 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
10c80 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
10c90 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
10ca0 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
10cb0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
10cc0 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
10cd0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
10ce0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
10cf0 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
10d00 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
10d10 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
10d20 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
10d30 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
10d40 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
10d50 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
10d60 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
10d70 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
10d80 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
10d90 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
10da0 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
10db0 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
10dc0 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
10dd0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10de0 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
10df0 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
10e00 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
10e10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10e20 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
10e30 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
10e40 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
10e50 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
10e60 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
10e70 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
10e80 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
10e90 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
10ea0 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
10eb0 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
10ec0 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
10ed0 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
10ee0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
10ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10f00 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
10f10 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
10f20 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
10f30 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
10f40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
10f50 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
10f60 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
10f70 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
10f80 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
10f90 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
10fa0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
10fb0 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
10fc0 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
10fd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
10fe0 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
10ff0 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
11000 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
11010 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
11020 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
11030 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
11040 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
11050 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
11060 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
11070 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
11080 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
11090 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
110a0 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
110b0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
110c0 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
110d0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
110e0 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
110f0 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
11100 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
11110 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
11120 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
11130 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
11140 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
11150 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
11160 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
11170 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
11180 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
11190 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
111a0 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
111b0 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
111c0 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
111d0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
111e0 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72  dest;    /* Wher
111f0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f  e the SELECT sho
11200 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74  uld store result
11210 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
11220 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f  egYield;       /
11230 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
11240 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e  ng co-routine en
11250 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  try-point */.   
11260 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
11270 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
11280 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
11290 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
112a0 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
112b0 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  A record to be i
112c0 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e  nsert into the n
112d0 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ew table */.    
112e0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
112f0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f        /* Rowid o
11300 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  f the next row t
11310 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  o insert */.    
11320 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f    int addrInsLoo
11330 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  p;    /* Top of 
11340 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73  the loop for ins
11350 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erting rows */. 
11360 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
11370 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61  Tab;     /* A ta
11380 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
11390 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  es the SELECT re
113a0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  sults */..      
113b0 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61  regYield = ++pPa
113c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
113d0 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72   regRec = ++pPar
113e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
113f0 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
11400 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
11410 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
11420 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
11430 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
11440 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
11450 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11460 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
11470 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
11480 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
11490 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
114a0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
114b0 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
114c0 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
114d0 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
114e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
114f0 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
11500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11510 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11520 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
11530 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54  gYield, 0, addrT
11540 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  op);.      if( p
11550 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
11560 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c  turn;.      pSel
11570 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
11580 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
11590 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
115a0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54  .      if( pSelT
115b0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
115c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
115d0 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
115e0 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
115f0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
11600 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
11610 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
11620 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
11630 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
11640 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
11650 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
11660 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
11670 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11680 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
11690 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
116a0 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
116b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
116c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
116d0 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
116e0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
116f0 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
11700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
11710 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
11720 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  egYield);.      
11730 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11740 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d  ere(v, addrTop -
11750 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49   1);.      addrI
11760 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
11770 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11780 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
11790 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
117a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
117b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
117c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
117d0 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
117e0 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
117f0 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
11800 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
11810 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
11820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11830 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
11840 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
11850 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
11860 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11870 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
11880 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
11890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
118a0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
118b0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
118c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
118d0 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
118e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
118f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11900 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
11910 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
11920 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
11930 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
11940 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11950 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
11960 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
11970 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
11980 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
11990 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
119a0 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
119b0 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
119c0 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
119d0 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
119e0 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
119f0 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
11a00 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
11a10 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
11a20 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
11a30 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
11a40 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
11a50 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
11a60 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
11a70 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
11a80 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
11a90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11aa0 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
11ab0 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
11ac0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
11ad0 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
11ae0 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
11af0 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
11b00 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
11b10 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
11b20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
11b30 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
11b40 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
11b50 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
11b60 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
11b70 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
11b80 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
11b90 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
11ba0 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
11bb0 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
11bc0 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
11bd0 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
11be0 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
11bf0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
11c00 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
11c10 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
11c20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11c30 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11c40 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
11c50 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
11c60 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
11c70 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
11c80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11c90 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
11ca0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
11cb0 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
11cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11cd0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
11ce0 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
11cf0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
11d00 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
11d10 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
11d20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
11d30 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
11d40 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
11d50 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
11d60 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
11d70 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
11d80 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
11d90 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
11da0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
11db0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11dc0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
11dd0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
11de0 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
11df0 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
11e00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11e10 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
11e20 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11e30 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
11e40 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
11e50 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
11e60 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44           pDb->zD
11e70 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  bSName.        )
11e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11e90 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
11ea0 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
11eb0 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
11ec0 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
11ed0 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
11ee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
11ef0 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
11f00 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  Db,.           s
11f10 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11f20 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
11f30 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67   AND type!='trig
11f40 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ger'", p->zName)
11f50 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
11f60 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
11f70 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
11f80 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
11f90 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
11fa0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
11fb0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
11fc0 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
11fd0 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
11fe0 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
11ff0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12000 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12010 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
12020 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
12030 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
12040 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
12050 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20  >zName, p);.    
12060 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
12070 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
12080 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
12090 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
120a0 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
120b0 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  rt() */.      sq
120c0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
120d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
120e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
120f0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
12100 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
12110 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
12120 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e  emaChange;..#ifn
12130 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12140 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
12150 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
12160 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
12170 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
12180 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
12190 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
121a0 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
121b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
121c0 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
121d0 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
121e0 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
121f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
12200 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
12210 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
12220 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
12230 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
12240 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
12250 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
12260 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
12270 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
12280 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
12290 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
122a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
122b0 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
122c0 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
122d0 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
122e0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
122f0 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
12300 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
12310 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12320 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
12330 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12340 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
12350 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
12360 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
12370 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
12380 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
12390 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
123a0 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
123b0 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
123c0 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
123d0 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
123e0 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
123f0 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
12400 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
12410 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61    ExprList *pCNa
12420 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c  mes, /* Optional
12430 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f   list of view co
12440 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
12450 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
12460 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
12470 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
12480 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
12490 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
124a0 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
124b0 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
124c0 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
124d0 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
124e0 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
124f0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
12500 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
12510 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
12520 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
12530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12540 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
12550 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
12560 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
12570 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
12580 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12590 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
125a0 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
125b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
125c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
125d0 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
125e0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
125f0 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  iews");.    goto
12600 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
12610 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
12620 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
12630 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
12640 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
12650 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
12660 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12670 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
12680 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
12690 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
126a0 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54  fail;.  sqlite3T
126b0 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
126c0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
126d0 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
126e0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
126f0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
12700 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
12710 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
12720 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
12730 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  view", pName);. 
12740 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
12750 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
12760 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65  lect) ) goto cre
12770 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
12780 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
12790 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
127a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
127b0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
127c0 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
127d0 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
127e0 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
127f0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
12800 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
12810 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
12820 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
12830 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
12840 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
12850 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
12860 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
12870 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
12880 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
12890 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  eturns..  */.  i
128a0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
128b0 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53  ECT ){.    p->pS
128c0 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
128d0 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30  .    pSelect = 0
128e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
128f0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
12900 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
12910 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
12920 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20  P_REDUCE);.  }. 
12930 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
12940 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
12950 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
12960 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
12970 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12980 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
12990 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
129a0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
129b0 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
129c0 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
129d0 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
129e0 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
129f0 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
12a00 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
12a10 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
12a20 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73  End.z[0]!=0 || s
12a30 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  End.n==0 );.  if
12a40 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  ( sEnd.z[0]!=';'
12a50 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
12a60 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
12a70 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
12a80 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
12a90 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61   pBegin->z);.  a
12aa0 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
12ab0 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
12ac0 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
12ad0 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
12ae0 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
12af0 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
12b00 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
12b10 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
12b20 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
12b30 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
12b40 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
12b50 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
12b60 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
12b70 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
12b80 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69  .create_view_fai
12b90 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  l:.  sqlite3Sele
12ba0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12bb0 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f  lect);.  if( IN_
12bc0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
12bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
12be0 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28  meExprlistUnmap(
12bf0 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29  pParse, pCNames)
12c00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
12c10 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
12c20 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65  , pCNames);.  re
12c30 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
12c40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
12c50 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
12c60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12c70 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
12c80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12c90 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
12ca0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
12cb0 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
12cc0 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
12cd0 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
12ce0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
12cf0 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
12d00 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
12d10 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
12d20 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
12d30 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
12d40 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
12d50 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
12d60 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
12d70 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
12d80 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
12d90 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
12da0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
12db0 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
12dc0 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
12dd0 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
12de0 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
12df0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
12e00 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
12e10 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
12e20 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
12e30 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
12e40 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
12e50 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
12e60 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
12e70 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
12e80 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
12e90 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
12ea0 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
12eb0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
12ec0 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
12ed0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12ee0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
12ef0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
12f00 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
12f10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12f20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12f30 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65  BLE.  int rc;.#e
12f40 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
12f50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
12f60 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  ZATION.  sqlite3
12f70 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
12f80 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
12f90 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65  th pointer */.#e
12fa0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12fb0 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
12fc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12fd0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62  IRTUALTABLE.  db
12fe0 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b  ->nSchemaLock++;
12ff0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
13000 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
13010 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
13020 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
13030 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  k--;.  if( rc ){
13040 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
13050 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
13060 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
13070 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
13080 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13090 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
130a0 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
130b0 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
130c0 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
130d0 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
130e0 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
130f0 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
13100 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
13110 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
13120 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
13130 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
13140 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
13150 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
13160 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
13170 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
13180 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
13190 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
131a0 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
131b0 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
131c0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
131d0 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
131e0 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
131f0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
13200 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
13210 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
13220 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
13230 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
13240 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
13250 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
13260 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
13270 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
13280 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
13290 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
132a0 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
132b0 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
132c0 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
132d0 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
132e0 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
132f0 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
13300 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
13310 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
13320 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
13330 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
13340 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
13350 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
13360 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
13370 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
13380 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
13390 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
133a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
133b0 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
133c0 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
133d0 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
133e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
133f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
13400 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
13410 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
13420 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
13430 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
13440 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
13450 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
13460 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
13470 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
13480 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
13490 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
134a0 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
134b0 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
134c0 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
134d0 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
134e0 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
134f0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
13500 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
13510 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
13520 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
13530 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
13540 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
13550 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
13560 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
13570 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
13580 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
13590 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
135a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
135b0 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
135c0 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
135d0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
135e0 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
135f0 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
13600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13610 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
13620 20 20 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64      u8 eParseMod
13630 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72  e = pParse->ePar
13640 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72  seMode;.    pPar
13650 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d  se->eParseMode =
13660 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d   PARSE_MODE_NORM
13670 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  AL;.#endif.    n
13680 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
13690 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
136a0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
136b0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
136c0 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
136d0 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
136e0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
136f0 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64  Disable++;.#ifnd
13700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13710 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
13720 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
13730 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
13740 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
13750 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
13760 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
13770 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
13780 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
13790 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
137a0 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
137b0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
137c0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
137d0 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
137e0 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
137f0 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
13800 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  eck ){.      /* 
13810 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
13820 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e  (arglist) AS ...
13830 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61  .      ** The na
13840 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
13850 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
13860 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20  are taken from. 
13870 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20       ** arglist 
13880 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
13890 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  in pTable->pChec
138a0 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66  k.  The pCheck f
138b0 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  ield.      ** no
138c0 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45  rmally holds CHE
138d0 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
138e0 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  n an ordinary ta
138f0 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20  ble, but for.   
13900 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20     ** a VIEW it 
13910 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f  holds the list o
13920 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a  f column names..
13930 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
13940 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
13950 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
13960 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
13970 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f      &pTable->nCo
139a0 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l, &pTable->aCol
139b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
139c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
139d0 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72   .       && pPar
139e0 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20  se->nErr==0.    
139f0 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43     && pTable->nC
13a00 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ol==pSel->pEList
13a10 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
13a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13a30 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
13a40 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
13a50 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20  pParse, pTable, 
13a60 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
13a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
13a80 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lTab ){.      /*
13a90 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
13aa0 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74  e AS...  without
13ab0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73   an argument lis
13ac0 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20  t.  Construct.  
13ad0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d      ** the colum
13ae0 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
13af0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13b00 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
13b10 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a  he view..      *
13b20 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13b30 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
13b40 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
13b50 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
13b60 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
13b70 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
13b80 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
13b90 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
13ba0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
13bb0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
13bc0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
13bd0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
13be0 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
13bf0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
13c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
13c10 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
13c20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
13c30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
13c40 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
13c50 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  SelTab);.    sql
13c60 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
13c70 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  (db, pSel);.    
13c80 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
13c90 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65  isable--;.#ifnde
13ca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
13cb0 54 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61  TERTABLE.    pPa
13cc0 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20  rse->eParseMode 
13cd0 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65  = eParseMode;.#e
13ce0 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ndif.  } else {.
13cf0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
13d00 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
13d10 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
13d20 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
13d30 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  s;.  if( db->mal
13d40 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
13d50 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
13d60 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
13d70 61 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c  able);.    pTabl
13d80 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->aCol = 0;.   
13d90 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
13da0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
13db0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13dc0 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
13dd0 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
13de0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13df0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
13e00 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13e10 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13e20 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
13e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
13e40 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
13e50 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
13e60 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
13e70 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
13e80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
13e90 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13ea0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
13eb0 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
13ec0 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
13ed0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13ee0 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
13ef0 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
13f00 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
13f10 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
13f20 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
13f30 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
13f40 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
13f50 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
13f60 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
13f70 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
13f80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
13f90 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13fa0 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
13fb0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
13fc0 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
13fd0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
13fe0 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
13ff0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
14000 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
14010 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
14020 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
14030 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
14040 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
14050 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
14060 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
14070 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
14080 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
14090 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
140a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
140b0 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
140c0 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
140d0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
140e0 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
140f0 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
14100 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
14110 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
14120 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
14130 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
14140 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
14150 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
14160 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
14170 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
14180 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
14190 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
141a0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
141b0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
141c0 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
141d0 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
141e0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
141f0 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
14200 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
14210 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
14220 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
14230 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
14240 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
14250 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
14260 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
14270 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
14280 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
14290 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
142a0 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
142b0 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
142c0 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
142d0 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
142e0 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
142f0 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
14300 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
14310 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
14320 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
14330 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
14340 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
14350 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
14360 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
14370 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
14380 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
14390 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
143a0 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
143b0 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
143c0 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
143d0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
143e0 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
143f0 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
14400 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
14410 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
14420 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
14430 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
14440 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
14450 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
14460 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
14470 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
14480 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
14490 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
144a0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
144b0 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
144c0 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
144d0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
144e0 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
144f0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
14500 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
14510 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
14520 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
14530 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
14540 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
14550 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
14560 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
14570 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
14580 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
14590 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
145a0 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
145b0 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
145c0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
145d0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
145e0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
145f0 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
14600 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
14610 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
14620 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
14630 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
14640 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
14650 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
14660 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
14670 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
14680 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
14690 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
146a0 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
146b0 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
146c0 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
146d0 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
146e0 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
146f0 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
14700 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
14710 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
14720 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
14730 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
14740 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
14750 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
14760 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
14770 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
14780 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
14790 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
147a0 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
147b0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
147c0 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
147d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
147e0 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
147f0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
14800 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14810 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
14820 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14830 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
14840 69 54 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74  iTable<2 ) sqlit
14850 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14860 65 2c 20 22 63 6f 72 72 75 70 74 20 73 63 68 65  e, "corrupt sche
14870 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ma");.  sqlite3V
14880 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14890 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
148a0 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
148b0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
148c0 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
148d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
148e0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
148f0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
14900 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
14910 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
14920 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
14930 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
14940 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
14950 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
14960 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
14970 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
14980 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
14990 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
149a0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
149b0 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
149c0 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
149d0 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
149e0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
149f0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
14a00 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
14a10 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
14a20 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
14a30 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
14a40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14a50 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
14a60 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
14a70 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
14a80 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
14a90 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
14aa0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
14ab0 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
14ac0 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
14ad0 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
14ae0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
14af0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
14b00 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
14b10 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c  STER_NAME, iTabl
14b20 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
14b30 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
14b40 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14b50 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
14b60 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
14b70 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
14b80 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
14b90 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
14ba0 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
14bb0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
14bc0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
14bd0 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
14be0 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
14bf0 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
14c00 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
14c10 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
14c20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
14c30 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
14c40 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
14c50 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
14c60 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
14c70 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
14c80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
14c90 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
14ca0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
14cb0 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a  ble *pTab){.  /*
14cc0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14cd0 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
14ce0 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
14cf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14d00 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
14d10 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
14d20 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
14d30 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
14d40 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
14d50 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
14d60 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
14d70 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
14d80 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
14d90 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
14da0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
14db0 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
14dc0 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
14dd0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
14de0 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
14df0 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
14e00 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
14e10 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
14e20 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
14e30 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
14e40 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
14e50 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
14e60 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
14e70 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
14e80 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
14e90 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
14ea0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
14eb0 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
14ec0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
14ed0 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
14ee0 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
14ef0 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
14f00 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
14f10 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
14f20 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
14f30 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
14f40 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
14f50 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
14f60 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
14f70 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
14f80 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
14f90 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
14fa0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
14fb0 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
14fc0 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
14fd0 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
14fe0 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
14ff0 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
15000 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
15010 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
15020 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
15030 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
15040 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
15050 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
15060 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
15070 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
15080 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
15090 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
150a0 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
150b0 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
150c0 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
150d0 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
150e0 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
150f0 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
15100 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
15110 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
15120 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
15130 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
15140 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
15150 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
15160 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
15170 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
15180 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
15190 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
151a0 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
151b0 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
151c0 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
151d0 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
151e0 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
151f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15200 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
15210 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
15220 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
15230 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
15240 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
15250 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
15260 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
15270 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
15280 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
15290 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
152a0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
152b0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
152c0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
152d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
152e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
152f0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
15300 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
15310 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
15320 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
15330 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
15340 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
15350 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
15360 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
15370 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
15380 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
15390 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
153a0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
153b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
153c0 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
153d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
153e0 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
153f0 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
15400 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
15410 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
15420 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
15430 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
15440 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
15450 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
15460 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
15470 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
15480 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
15490 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
154a0 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
154b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
154c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
154d0 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
154e0 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
154f0 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
15500 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
15510 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
15520 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
15530 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
15540 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15550 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
15560 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
15570 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
15580 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
15590 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
155a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
155b0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
155c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
155d0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
155e0 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
155f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15600 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
15610 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
15620 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
15630 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
15640 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
15650 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
15660 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
15670 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
15680 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
15690 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
156a0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
156b0 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
156c0 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
156d0 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
156e0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
156f0 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
15700 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
15710 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
15720 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
15730 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
15740 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
15750 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
15760 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
15770 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
15780 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
15790 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
157a0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
157b0 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
157c0 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
157d0 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
157e0 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
157f0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
15800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15810 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
15820 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
15830 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
15840 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
15850 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
15860 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
15870 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
15880 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
15890 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
158a0 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
158b0 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
158c0 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
158d0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
158e0 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
158f0 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
15900 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
15910 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
15920 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
15930 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
15940 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
15950 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
15960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
15970 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
15980 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
15990 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
159a0 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
159b0 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
159c0 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62  ->zDbSName, pTab
159d0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
159e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
159f0 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
15a00 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
15a10 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
15a20 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
15a30 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
15a40 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
15a50 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
15a60 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
15a70 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
15a80 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
15a90 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
15aa0 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
15ab0 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
15ac0 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
15ad0 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
15ae0 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
15af0 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
15b00 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
15b10 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
15b20 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
15b30 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
15b40 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
15b50 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
15b60 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
15b70 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
15b80 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
15b90 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
15ba0 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
15bb0 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
15bc0 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
15bd0 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
15be0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15bf0 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
15c00 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
15c10 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
15c20 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
15c30 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
15c40 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
15c50 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
15c60 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
15c70 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
15c80 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
15c90 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
15ca0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
15cb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15cc0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15cd0 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
15ce0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
15cf0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
15d00 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
15d10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15d20 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15d30 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
15d40 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
15d50 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
15d60 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
15d70 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
15d80 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
15d90 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  (db, iDb);.}../*
15da0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15db0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
15dc0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
15dd0 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
15de0 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
15df0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
15e00 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
15e10 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
15e20 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
15e30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
15e40 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
15e50 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
15e60 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
15e70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
15e80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15e90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
15ea0 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62  t iDb;..  if( db
15eb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15ec0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
15ed0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15ee0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
15ef0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61  ->nErr==0 );.  a
15f00 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
15f10 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 73  rc==1 );.  if( s
15f20 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
15f30 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
15f40 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
15f50 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64  .  if( noErr ) d
15f60 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b 2b  b->suppressErr++
15f70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
15f80 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
15f90 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b 0a  =LOCATE_VIEW );.
15fa0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
15fb0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
15fc0 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
15fd0 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  &pName->a[0]);. 
15fe0 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d   if( noErr ) db-
15ff0 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a  >suppressErr--;.
16000 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
16010 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20  {.    if( noErr 
16020 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
16030 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
16040 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
16050 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
16060 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
16070 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69  p_table;.  }.  i
16080 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
16090 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
160a0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
160b0 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
160c0 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
160d0 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69  ..  /* If pTab i
160e0 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  s a virtual tabl
160f0 65 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43  e, call ViewGetC
16100 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20  olumnNames() to 
16110 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69  ensure.  ** it i
16120 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  s initialized.. 
16130 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
16140 75 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c  ual(pTab) && sql
16150 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
16160 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
16170 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  Tab) ){.    goto
16180 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
16190 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
161a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
161b0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
161c0 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f  int code;.    co
161d0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
161e0 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
161f0 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b);.    const ch
16200 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
16210 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
16220 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16230 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
16240 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
16250 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16260 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
16270 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
16280 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16290 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
162a0 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
162b0 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
162c0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
162d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
162e0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
162f0 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
16300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
16310 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
16320 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
16330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16340 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16350 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
16360 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
16370 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
16380 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
16390 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
163a0 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
163b0 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f  e(db, pTab)->pMo
163c0 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66  d->zName;.#endif
163d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
163e0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
163f0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
16400 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
16410 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
16420 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
16430 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
16440 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
16450 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
16460 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
16470 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16480 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
16490 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a  >zName, zArg2, z
164a0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
164b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
164c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
164d0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
164e0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
164f0 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
16500 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
16510 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
16520 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
16530 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
16540 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
16550 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
16560 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
16570 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  0 .    && sqlite
16580 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
16590 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
165a0 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a  tat", 11)!=0 ){.
165b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
165c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
165d0 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
165e0 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
165f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
16600 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
16610 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
16620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16630 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
16640 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
16650 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
16660 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
16670 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
16680 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
16690 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
166a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
166b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
166c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
166d0 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
166e0 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
166f0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
16700 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
16710 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
16720 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
16730 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
16740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16750 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
16760 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
16770 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
16780 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
16790 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
167a0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
167b0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
167c0 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
167d0 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
167e0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
167f0 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
16800 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
16810 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
16820 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
16830 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
16840 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
16850 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
16860 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
16870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
16880 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
16890 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22  arse, iDb, "tbl"
168a0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
168b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44        sqlite3FkD
168c0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
168d0 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
168e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
168f0 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
16900 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
16910 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
16920 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
16930 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
16940 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
16950 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
16960 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16970 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
16980 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
16990 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
169a0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
169b0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
169c0 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
169d0 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
169e0 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
169f0 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
16a00 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
16a10 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
16a20 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
16a30 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
16a40 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
16a50 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
16a60 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
16a70 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
16a80 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
16a90 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
16aa0 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
16ab0 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
16ac0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
16ad0 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
16ae0 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
16af0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
16b00 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
16b10 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
16b20 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
16b30 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
16b40 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
16b50 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
16b60 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
16b70 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
16b80 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
16b90 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
16ba0 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
16bb0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
16bc0 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
16bd0 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
16be0 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
16bf0 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
16c00 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
16c10 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
16c20 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
16c30 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
16c40 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
16c50 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
16c60 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
16c70 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
16c80 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
16c90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
16ca0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
16cb0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16cc0 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
16cd0 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
16ce0 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
16cf0 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
16d00 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
16d10 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16d20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
16d30 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
16d40 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
16d50 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
16d60 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
16d70 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
16d80 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
16d90 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
16da0 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
16db0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16dc0 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
16dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
16de0 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
16df0 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
16e00 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
16e10 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
16e20 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
16e30 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
16e40 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
16e50 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
16e60 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
16e70 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
16e80 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
16e90 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
16ea0 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
16eb0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
16ec0 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
16ed0 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
16ee0 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
16ef0 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
16f00 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
16f10 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
16f20 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16f30 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
16f40 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
16f50 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
16f60 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
16f70 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
16f80 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
16f90 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
16fa0 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
16fb0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
16fc0 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
16fd0 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
16fe0 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
16ff0 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
17000 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
17010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17020 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
17030 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17040 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
17050 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
17060 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
17070 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
17080 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
17090 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
170a0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
170b0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
170c0 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
170d0 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
170e0 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
170f0 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
17100 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
17110 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
17120 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
17130 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
17140 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
17150 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
17160 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
17170 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
17180 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
17190 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
171a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
171b0 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
171c0 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
171d0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
171e0 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
171f0 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
17200 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
17210 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
17220 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
17230 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
17240 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28 20 49 4e  To = z;.  if( IN
17250 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
17260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
17270 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
17280 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 54  se, (void*)z, pT
17290 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  o);.  }.  memcpy
172a0 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
172b0 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
172c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
172d0 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
172e0 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
172f0 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
17300 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
17310 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
17320 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
17330 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
17340 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
17350 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
17360 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
17370 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
17380 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
17390 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
173a0 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
173b0 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
173c0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
173d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
173e0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
173f0 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
17400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17420 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
17430 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
17440 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17450 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
17460 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
17470 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
17480 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
17490 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
174a0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
174b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
174c0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
174d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f   }.      if( IN_
174e0 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
174f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17500 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
17510 28 70 50 61 72 73 65 2c 20 26 70 46 4b 65 79 2d  (pParse, &pFKey-
17520 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72 6f 6d 43  >aCol[i], pFromC
17530 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
17540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17550 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
17560 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
17570 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
17580 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
17590 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
175a0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
175b0 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
175c0 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
175d0 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e        if( IN_REN
175e0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
175f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
17600 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
17610 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43 6f 6c 2d  arse, z, pToCol-
17620 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
17630 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
17640 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
17650 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
17660 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
17670 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
17680 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
17690 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
176a0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
176b0 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
176c0 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
176d0 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
176e0 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
176f0 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
17700 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
17710 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
17720 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
17730 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
17740 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
17750 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
17760 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
17770 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
17780 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
17790 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
177a0 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
177b0 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
177c0 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
177d0 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
177e0 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
177f0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
17800 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  db);.    goto fk
17810 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
17820 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
17830 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
17840 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
17850 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
17860 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
17870 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
17880 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
17890 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
178a0 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
178b0 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
178c0 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
178d0 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
178e0 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
178f0 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
17900 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
17910 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
17920 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17930 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
17940 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
17950 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
17960 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
17970 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
17980 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
17990 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
179a0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
179b0 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
179c0 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
179d0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
179e0 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
179f0 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
17a00 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
17a10 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
17a20 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
17a30 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
17a40 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
17a50 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
17a60 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
17a70 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
17a80 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
17a90 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
17aa0 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
17ab0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
17ac0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
17ad0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
17ae0 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
17af0 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
17b00 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
17b10 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
17b20 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
17b30 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
17b40 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
17b50 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
17b60 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
17b70 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
17b80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
17b90 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
17ba0 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
17bb0 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
17bc0 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
17bd0 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
17be0 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
17bf0 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
17c00 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17c10 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
17c20 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
17c30 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
17c40 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
17c50 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
17c60 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
17c70 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
17c80 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
17c90 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
17ca0 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
17cb0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
17cc0 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
17cd0 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
17ce0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
17cf0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
17d00 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
17d10 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
17d20 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
17d30 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
17d40 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
17d50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
17d60 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
17d70 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
17d80 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
17d90 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
17da0 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
17db0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
17dc0 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
17dd0 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
17de0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
17df0 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
17e00 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
17e10 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
17e20 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
17e30 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
17e40 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
17e50 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
17e60 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
17e70 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
17e80 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
17e90 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
17ea0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
17eb0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17ec0 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
17ed0 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
17ee0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
17ef0 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
17f00 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
17f10 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
17f20 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
17f30 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20  t iSorter;      
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f50 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79  Cursor opened by
17f60 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20   OpenSorter (if 
17f70 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  in use) */.  int
17f80 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
17f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17fa0 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
17fb0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
17fc0 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
17fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
17fe0 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
17ff0 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
18000 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  on */.  int tnum
18010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18020 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
18030 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
18040 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61    int iPartIdxLa
18050 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
18060 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73   /* Jump to this
18070 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61   label to skip a
18080 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a   row */.  Vdbe *
18090 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
180a0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
180b0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
180c0 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
180d0 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
180e0 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
180f0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
18100 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
18110 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
18140 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69  ding assembled i
18150 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
18160 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
18170 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
18180 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
18190 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
181a0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
181b0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
181c0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
181d0 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
181e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
181f0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
18200 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
18210 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
18220 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
18230 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
18240 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
18250 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
18260 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
18270 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
18280 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
18290 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
182a0 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
182b0 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
182c0 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
182d0 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
182e0 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
182f0 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
18300 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
18310 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
18320 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
18330 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
18340 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
18350 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
18360 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
18370 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70  x->tnum;.  }.  p
18380 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
18390 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
183a0 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61  se, pIndex);.  a
183b0 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c  ssert( pKey!=0 |
183c0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
183d0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
183e0 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  rr );..  /* Open
183f0 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
18400 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
18410 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
18420 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
18430 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
18440 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18450 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
18460 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78  orter, 0, pIndex
18470 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72  ->nKeyCol, (char
18480 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
18490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
184a0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20  yInfoRef(pKey), 
184b0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
184c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c  /* Open the tabl
184d0 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  e. Loop through 
184e0 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
184f0 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67  table, inserting
18500 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f   index.  ** reco
18510 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  rds into the sor
18520 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ter. */.  sqlite
18530 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
18540 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
18550 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
18560 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
18570 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18580 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
18590 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
185a0 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
185b0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
185c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
185d0 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72    sqlite3MultiWr
185e0 69 74 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ite(pParse);..  
185f0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
18600 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
18610 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
18620 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
18630 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
18640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18650 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
18660 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
18670 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
18680 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
18690 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
186a0 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
186b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
186c0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
186d0 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
186e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
186f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18700 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
18710 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
18720 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
18730 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
18740 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
18750 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18760 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
18770 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
18780 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
18790 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
187a0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
187b0 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
187c0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
187d0 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
187e0 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
187f0 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
18800 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
18810 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18820 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
18830 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
18840 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18850 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
18860 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b  Index(pIndex) ){
18870 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
18880 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
18890 20 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d   1);.    addr2 =
188a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
188b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
188c0 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
188d0 79 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f 45  yAbortable(v, OE
188e0 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20 73 71 6c  _Abort);.    sql
188f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
18900 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f  t(v, OP_SorterCo
18910 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20  mpare, iSorter, 
18920 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20  j2, regRecord,. 
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
18950 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
18960 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
18970 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
18980 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
18990 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
189a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
189b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
189c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
189d0 2a 20 4d 6f 73 74 20 43 52 45 41 54 45 20 49 4e  * Most CREATE IN
189e0 44 45 58 20 61 6e 64 20 52 45 49 4e 44 45 58 20  DEX and REINDEX 
189f0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
18a00 61 72 65 20 6e 6f 74 20 55 4e 49 51 55 45 20 63  are not UNIQUE c
18a10 61 6e 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 62  an not.    ** ab
18a20 6f 72 74 2e 20 54 68 65 20 65 78 63 65 70 74 69  ort. The excepti
18a30 6f 6e 20 69 73 20 69 66 20 6f 6e 65 20 6f 66 20  on is if one of 
18a40 74 68 65 20 69 6e 64 65 78 65 64 20 65 78 70 72  the indexed expr
18a50 65 73 73 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 73  essions contains
18a60 20 61 0a 20 20 20 20 2a 2a 20 75 73 65 72 20 66   a.    ** user f
18a70 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74 68 72  unction that thr
18a80 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
18a90 20 77 68 65 6e 20 69 74 20 69 73 20 65 76 61 6c   when it is eval
18aa0 75 61 74 65 64 2e 20 42 75 74 20 74 68 65 0a 20  uated. But the. 
18ab0 20 20 20 2a 2a 20 6f 76 65 72 68 65 61 64 20 6f     ** overhead o
18ac0 66 20 61 64 64 69 6e 67 20 61 20 73 74 61 74 65  f adding a state
18ad0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  ment journal to 
18ae0 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  a CREATE INDEX s
18af0 74 61 74 65 6d 65 6e 74 20 69 73 0a 20 20 20 20  tatement is.    
18b00 2a 2a 20 76 65 72 79 20 73 6d 61 6c 6c 20 28 73  ** very small (s
18b10 69 6e 63 65 20 6d 6f 73 74 20 6f 66 20 74 68 65  ince most of the
18b20 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 64   pages written d
18b30 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 63 6f  o not contain co
18b40 6e 74 65 6e 74 20 74 68 61 74 0a 20 20 20 20 2a  ntent that.    *
18b50 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  * needs to be re
18b60 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 74  stored if the st
18b70 61 74 65 6d 65 6e 74 20 61 62 6f 72 74 73 29 2c  atement aborts),
18b80 20 73 6f 20 77 65 20 63 61 6c 6c 20 0a 20 20 20   so we call .   
18b90 20 2a 2a 20 73 71 6c 69 74 65 33 4d 61 79 41 62   ** sqlite3MayAb
18ba0 6f 72 74 28 29 20 66 6f 72 20 61 6c 6c 20 43 52  ort() for all CR
18bb0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
18bc0 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 73  ments.  */.    s
18bd0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
18be0 50 61 72 73 65 29 3b 0a 20 20 20 20 61 64 64 72  Parse);.    addr
18bf0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
18c00 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18c10 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
18c20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
18c30 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
18c40 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
18c50 78 29 3b 0a 20 20 69 66 28 20 21 70 49 6e 64 65  x);.  if( !pInde
18c60 78 2d 3e 62 41 73 63 4b 65 79 42 75 67 20 29 7b  x->bAscKeyBug ){
18c70 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 4f 50 5f  .    /* This OP_
18c80 53 65 65 6b 45 6e 64 20 6f 70 63 6f 64 65 20 6d  SeekEnd opcode m
18c90 61 6b 65 73 20 69 6e 64 65 78 20 69 6e 73 65 72  akes index inser
18ca0 74 20 66 6f 72 20 61 20 52 45 49 4e 44 45 58 20  t for a REINDEX 
18cb0 67 6f 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 66  go much.    ** f
18cc0 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
18cd0 67 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65  g unnecessary se
18ce0 65 6b 73 2e 20 20 42 75 74 20 74 68 65 20 6f 70  eks.  But the op
18cf0 74 69 6d 69 7a 61 74 69 6f 6e 20 64 6f 65 73 0a  timization does.
18d00 20 20 20 20 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20      ** not work 
18d10 66 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  for UNIQUE const
18d20 72 61 69 6e 74 20 69 6e 64 65 78 65 73 20 6f 6e  raint indexes on
18d30 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18d40 61 62 6c 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  ables.    ** wit
18d50 68 20 44 45 53 43 20 70 72 69 6d 61 72 79 20 6b  h DESC primary k
18d60 65 79 73 2c 20 73 69 6e 63 65 20 74 68 6f 73 65  eys, since those
18d70 20 69 6e 64 65 78 65 73 20 68 61 76 65 20 74 68   indexes have th
18d80 65 72 65 20 6b 65 79 73 20 69 6e 0a 20 20 20 20  ere keys in.    
18d90 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  ** a different o
18da0 72 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6d 61  rder from the ma
18db0 69 6e 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  in table..    **
18dc0 20 53 65 65 20 74 69 63 6b 65 74 3a 20 68 74 74   See ticket: htt
18dd0 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  ps://www.sqlite.
18de0 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 62 62 61  org/src/info/bba
18df0 37 62 36 39 66 39 38 34 39 62 35 62 66 0a 20 20  7b69f9849b5bf.  
18e00 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
18e10 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18e20 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b  _SeekEnd, iIdx);
18e30 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
18e40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
18e50 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
18e60 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
18e70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18e80 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
18e90 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
18ea0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
18eb0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
18ec0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
18ed0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18ee0 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
18ef0 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
18f00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
18f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18f20 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
18f30 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
18f40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
18f50 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
18f60 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18f70 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
18f80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18f90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
18fa0 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
18fb0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
18fc0 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
18fd0 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
18fe0 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
18ff0 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
19000 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
19010 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
19020 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
19030 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
19040 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
19050 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
19060 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
19070 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
19080 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
19090 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
190a0 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
190b0 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
190c0 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
190d0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
190e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
190f0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
19100 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
19110 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
19120 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
19130 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
19140 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
19150 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19160 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
19170 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
19180 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
19190 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
191a0 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
191b0 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
191c0 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
191d0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
191e0 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
191f0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
19200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
19210 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
19220 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
19230 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
19240 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
19250 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
19260 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
19270 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
19280 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
19290 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
192a0 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
192b0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
192c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
192d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
192e0 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
192f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
19300 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
19330 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
19340 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
19350 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
19360 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
19370 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
19380 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
19390 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
193a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
193b0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
193c0 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
193d0 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
193e0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
193f0 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
19400 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
19410 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
19420 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
19430 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
19440 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
19450 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
19460 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
19470 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
19480 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
19490 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
194a0 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
194b0 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
194c0 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
194d0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
194e0 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
194f0 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
19500 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
19510 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
19520 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
19530 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
19540 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
19550 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
19560 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
19570 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
19580 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
19590 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
195a0 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
195b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
195c0 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
195d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
195e0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
195f0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
19600 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
19610 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
19620 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
19630 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
19640 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
19650 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
19660 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
19670 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
19680 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
19690 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
196a0 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
196b0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
196c0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
196d0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
196e0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
196f0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
19700 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
19710 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
19720 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
19730 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
19740 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
19750 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
19760 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
19770 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
19780 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
19790 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
197a0 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
197b0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
197c0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
197d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
197e0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
197f0 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20  3CreateIndex(.  
19800 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19810 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d     /* All inform
19820 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73  ation about this
19830 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65   parse */.  Toke
19840 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
19850 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
19860 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
19870 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  be NULL */.  Tok
19880 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
19890 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
198a0 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
198b0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53  y be NULL */.  S
198c0 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65  rcList *pTblName
198d0 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e  , /* Table to in
198e0 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d  dex. Use pParse-
198f0 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20  >pNewTable if 0 
19900 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
19910 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73  List,   /* A lis
19920 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
19930 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
19940 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
19950 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20     /* OE_Abort, 
19960 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65  OE_Ignore, OE_Re
19970 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e  place, or OE_Non
19980 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53  e */.  Token *pS
19990 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  tart,     /* The
199a0 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68   CREATE token th
199b0 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73  at begins this s
199c0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  tatement */.  Ex
199d0 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20  pr *pPIWhere,   
199e0 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
199f0 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64   for partial ind
19a00 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ices */.  int so
19a10 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
19a20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
19a30 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
19a40 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
19a50 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20  int ifNotExist, 
19a60 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
19a70 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
19a80 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38  y exists */.  u8
19a90 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20   idxType        
19aa0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79   /* The index ty
19ab0 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  pe */.){.  Table
19ac0 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
19ad0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
19ae0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
19af0 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
19b00 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
19b10 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
19b20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
19b30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
19b40 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
19b50 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
19b60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19b70 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
19b80 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
19b90 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73  , j;.  DbFixer s
19ba0 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
19bb0 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
19bc0 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
19bd0 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
19be0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
19bf0 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
19c00 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
19c10 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
19c20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19c30 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
19c40 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
19c50 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
19c60 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
19c70 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
19c80 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19c90 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
19ca0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
19cb0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
19cc0 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
19cd0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
19ce0 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
19cf0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
19d00 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
19d10 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
19d20 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
19d30 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
19d40 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
19d50 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
19d60 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
19d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
19d80 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
19d90 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
19da0 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
19dd0 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
19de0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
19df0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
19e00 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
19e10 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
19e20 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
19e30 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
19e40 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
19e50 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
19e60 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
19e70 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28  tables */..  if(
19e80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19e90 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
19ea0 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  r>0 ){.    goto 
19eb0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19ec0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f  x;.  }.  if( IN_
19ed0 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20  DECLARE_VTAB && 
19ee0 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
19ef0 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b  IDXTYPE_PRIMARYK
19f00 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  EY ){.    goto e
19f10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
19f30 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
19f40 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
19f50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
19f60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19f70 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
19f80 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
19f90 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
19fa0 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
19fb0 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
19fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
19fd0 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
19fe0 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
19ff0 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
1a000 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1a010 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1a020 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
1a030 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
1a040 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
1a050 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
1a060 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
1a070 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
1a080 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1a090 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
1a0a0 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
1a0b0 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
1a0c0 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
1a0d0 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
1a0e0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
1a0f0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1a100 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
1a110 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20  ssert( pName && 
1a120 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66  pName->z );..#if
1a130 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a140 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49  _TEMPDB.    /* I
1a150 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
1a160 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64   was unqualified
1a170 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74  , check if the t
1a180 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61  able.    ** is a
1a190 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20   temp table. If 
1a1a0 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  so, set the data
1a1b0 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f  base to 1. Do no
1a1c0 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  t do this.    **
1a1d0 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67   if initialising
1a1e0 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65   a database sche
1a1f0 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ma..    */.    i
1a200 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
1a210 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  y ){.      pTab 
1a220 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1a230 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
1a240 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TblName);.      
1a250 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30  if( pName2->n==0
1a260 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
1a270 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
1a280 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
1a290 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
1a2a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a2b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
1a2c0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
1a2d0 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
1a2e0 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a  index", pName);.
1a2f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1a300 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c  ixSrcList(&sFix,
1a310 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20   pTblName) ){.  
1a320 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74      /* Because t
1a330 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72  he parser constr
1a340 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72  ucts pTblName fr
1a350 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
1a360 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a  tifier,.      **
1a370 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
1a380 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69  st can never fai
1a390 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  l. */.      asse
1a3a0 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rt(0);.    }.   
1a3b0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
1a3c0 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
1a3d0 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e  Parse, 0, &pTblN
1a3e0 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20  ame->a[0]);.    
1a3f0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1a400 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
1a410 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
1a420 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f  ( pTab==0 ) goto
1a430 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1a440 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d  ex;.    if( iDb=
1a450 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44  =1 && db->aDb[iD
1a460 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62  b].pSchema!=pTab
1a470 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
1a480 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1a490 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
1a4a0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
1a4b0 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64  reate a TEMP ind
1a4c0 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74  ex on non-TEMP t
1a4d0 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20  able \"%s\"",.  
1a4e0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
1a4f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
1a500 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a510 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1a520 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
1a530 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74  b) ) pPk = sqlit
1a540 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
1a550 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65  x(pTab);.  }else
1a560 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
1a570 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ame==0 );.    as
1a580 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20  sert( pStart==0 
1a590 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50  );.    pTab = pP
1a5a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
1a5b0 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29  .    if( !pTab )
1a5c0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a5d0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62  e_index;.    iDb
1a5e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1a5f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
1a600 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
1a610 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
1a620 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74  [iDb];..  assert
1a630 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
1a640 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1a650 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
1a660 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1a670 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
1a680 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
1a690 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69        && db->ini
1a6a0 74 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20 20 20  t.busy==0.      
1a6b0 20 26 26 20 70 54 62 6c 4e 61 6d 65 21 3d 30 0a   && pTblName!=0.
1a6c0 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
1a6d0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
1a6e0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1a6f0 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54  UserAuthTable(pT
1a700 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65  ab->zName)==0.#e
1a710 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1a720 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f  TE_ALLOW_SQLITE_
1a730 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20  MASTER_INDEX.   
1a740 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1a750 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  rICmp(&pTab->zNa
1a760 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21  me[7],"master")!
1a770 3d 30 0a 23 65 6e 64 69 66 0a 20 29 7b 0a 20 20  =0.#endif. ){.  
1a780 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a790 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
1a7a0 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
1a7b0 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
1a7c0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
1a7d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a7e0 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
1a7f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
1a800 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
1a810 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
1a820 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a830 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
1a840 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
1a850 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a860 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a870 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
1a880 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1a890 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
1a8a0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
1a8b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1a8c0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
1a8d0 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
1a8e0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
1a8f0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
1a900 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a910 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
1a920 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
1a930 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
1a940 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
1a950 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1a960 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
1a970 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
1a980 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
1a990 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
1a9a0 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
1a9b0 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
1a9c0 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
1a9d0 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
1a9e0 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
1a9f0 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
1aa00 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
1aa10 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
1aa20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
1aa30 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
1aa40 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
1aa50 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
1aa60 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
1aa70 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
1aa80 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
1aa90 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
1aaa0 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
1aab0 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
1aac0 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
1aad0 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
1aae0 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
1aaf0 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
1ab00 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
1ab10 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
1ab20 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
1ab30 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
1ab40 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
1ab50 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1ab60 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ab70 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
1ab80 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67  if( zName==0 ) g
1ab90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1aba0 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
1abb0 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29  t( pName->z!=0 )
1abc0 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1abd0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
1abe0 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
1abf0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
1ac00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1ac10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1ac20 7d 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45  }.    if( !IN_RE
1ac30 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
1ac40 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e       if( !db->in
1ac50 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
1ac60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
1ac70 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
1ac80 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
1ac90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1aca0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
1acb0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1acc0 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73  a table named %s
1acd0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
1ace0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1acf0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1ad00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ad10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1ad20 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
1ad30 61 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61  ame, pDb->zDbSNa
1ad40 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
1ad50 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73    if( !ifNotExis
1ad60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
1ad70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ad80 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
1ad90 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
1ada0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1adb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1adc0 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
1add0 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20  init.busy );.   
1ade0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
1adf0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1ae00 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1ae10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1ae20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1ae30 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1ae40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1ae50 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64    int n;.    Ind
1ae60 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66  ex *pLoop;.    f
1ae70 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70  or(pLoop=pTab->p
1ae80 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f  Index, n=1; pLoo
1ae90 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
1aea0 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20  pNext, n++){}.  
1aeb0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1aec0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
1aed0 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25  lite_autoindex_%
1aee0 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s_%d", pTab->zNa
1aef0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20  me, n);.    if( 
1af00 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
1af10 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1af20 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1af30 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69  .    /* Automati
1af40 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65  c index names ge
1af50 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74  nerated from wit
1af60 68 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  hin sqlite3_decl
1af70 61 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a  are_vtab().    *
1af80 2a 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65  * must have name
1af90 73 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69  s that are disti
1afa0 6e 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20  nct from normal 
1afb0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1afc0 6e 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68  names..    ** Th
1afd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
1afe0 65 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22  ement converts "
1aff0 73 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65  sqlite3_autoinde
1b000 78 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a  x..." into.    *
1b010 2a 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69  * "sqlite3_butoi
1b020 6e 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65  ndex..." in orde
1b030 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  r to make the na
1b040 6d 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20  mes distinct..  
1b050 20 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65    ** The "vtab_e
1b060 72 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65  rr.test" test de
1b070 6d 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e  monstrates the n
1b080 65 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74  eed of this stat
1b090 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ement. */.    if
1b0a0 28 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52  ( IN_SPECIAL_PAR
1b0b0 53 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b  SE ) zName[7]++;
1b0c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
1b0d0 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
1b0e0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
1b0f0 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
1b100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b110 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1b120 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f  if( !IN_RENAME_O
1b130 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e  BJECT ){.    con
1b140 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
1b150 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db->zDbSName;.  
1b160 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1b170 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1b180 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
1b190 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
1b1a0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
1b1b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1b1c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1b1d0 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
1b1e0 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
1b1f0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1b200 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
1b210 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
1b220 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1b230 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1b240 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
1b250 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1b260 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1b270 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1b280 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1b290 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1b2a0 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
1b2b0 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
1b2c0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
1b2d0 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
1b2e0 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
1b2f0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
1b300 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
1b310 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
1b320 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
1b330 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
1b340 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
1b350 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
1b360 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1b370 54 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20  Token prevCol;. 
1b380 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
1b390 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54  = &pTab->aCol[pT
1b3a0 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20  ab->nCol-1];.   
1b3b0 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
1b3c0 7c 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55  |= COLFLAG_UNIQU
1b3d0 45 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f  E;.    sqlite3To
1b3e0 6b 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c  kenInit(&prevCol
1b3f0 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
1b400 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
1b410 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1b420 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20  d(pParse, 0,.   
1b430 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b440 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
1b450 54 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c  TK_ID, &prevCol,
1b460 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   0));.    if( pL
1b470 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
1b480 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
1b4a0 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  st->nExpr==1 );.
1b4b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1b4c0 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
1b4d0 70 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72  pList, sortOrder
1b4e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b4f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
1b500 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73  heckLength(pPars
1b510 65 2c 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78  e, pList, "index
1b520 22 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  ");.    if( pPar
1b530 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
1b540 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1b550 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  x;.  }..  /* Fig
1b560 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1b570 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
1b580 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
1b590 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
1b5a0 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
1b5b0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b5c0 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
1b5d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1b5e0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1b5f0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1b600 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
1b610 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
1b620 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20   pExpr!=0 );.   
1b630 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1b640 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20  TK_COLLATE ){.  
1b650 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
1b660 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
1b670 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
1b680 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en));.    }.  }.
1b690 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f  .  /* .  ** Allo
1b6a0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73  cate the index s
1b6b0 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a  tructure. .  */.
1b6c0 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
1b6d0 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
1b6e0 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20  ;.  nExtraCol = 
1b6f0 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43  pPk ? pPk->nKeyC
1b700 6f 6c 20 3a 20 31 3b 0a 20 20 61 73 73 65 72 74  ol : 1;.  assert
1b710 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b  ( pList->nExpr +
1b720 20 6e 45 78 74 72 61 43 6f 6c 20 3c 3d 20 33 32   nExtraCol <= 32
1b730 37 36 37 20 2f 2a 20 46 69 74 73 20 69 6e 20 69  767 /* Fits in i
1b740 31 36 20 2a 2f 20 29 3b 0a 20 20 70 49 6e 64 65  16 */ );.  pInde
1b750 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
1b760 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  ateIndexObject(d
1b770 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  b, pList->nExpr 
1b780 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20  + nExtraCol,.   
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72     nName + nExtr
1b7c0 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b  a + 1, &zExtra);
1b7d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1b7e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1b7f0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b800 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1b810 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
1b820 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78  ALIGNMENT(pIndex
1b830 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29  ->aiRowLogEst) )
1b840 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1b850 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1b860 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29  (pIndex->azColl)
1b870 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e   );.  pIndex->zN
1b880 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  ame = zExtra;.  
1b890 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20  zExtra += nName 
1b8a0 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  + 1;.  memcpy(pI
1b8b0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
1b8c0 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
1b8d0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
1b8e0 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
1b8f0 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f  >onError = (u8)o
1b900 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78  nError;.  pIndex
1b910 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1b920 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
1b930 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54  ;.  pIndex->idxT
1b940 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20  ype = idxType;. 
1b950 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1b960 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1b970 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65  pSchema;.  pInde
1b980 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69  x->nKeyCol = pLi
1b990 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28  st->nExpr;.  if(
1b9a0 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20   pPIWhere ){.   
1b9b0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
1b9c0 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
1b9d0 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61  rse, pTab, NC_Pa
1b9e0 72 74 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c  rtIdx, pPIWhere,
1b9f0 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d   0);.    pIndex-
1ba00 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 20 3d  >pPartIdxWhere =
1ba10 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70   pPIWhere;.    p
1ba20 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d  PIWhere = 0;.  }
1ba30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ba40 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
1ba50 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
1ba60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1ba70 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
1ba80 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
1ba90 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
1baa0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
1bab0 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
1bac0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
1bad0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
1bae0 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
1baf0 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
1bb00 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
1bb10 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
1bb20 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
1bb30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
1bb40 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65  ze the list of e
1bb50 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
1bb60 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f  form the terms o
1bb70 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a  f the index and.
1bb80 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20    ** report any 
1bb90 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20  errors.  In the 
1bba0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
1bbb0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
1bbc0 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a   is exactly.  **
1bbd0 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
1bbe0 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75   store that colu
1bbf0 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d  mn in aiColumn[]
1bc00 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65  .  For general e
1bc10 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a  xpressions,.  **
1bc20 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78   populate pIndex
1bc30 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73  ->aColExpr and s
1bc40 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32  tore XN_EXPR (-2
1bc50 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e  ) in aiColumn[].
1bc60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1bc70 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
1bc80 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   if two or more 
1bc90 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69  columns of the i
1bca0 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74 69 63  ndex are identic
1bcb0 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49  al..  ** TODO: I
1bcc0 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69  ssue a warning i
1bcd0 66 20 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d  f the table prim
1bce0 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
1bcf0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1bd00 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20   ** index key.. 
1bd10 20 2a 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d 20   */.  pListItem 
1bd20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66  = pList->a;.  if
1bd30 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1bd40 43 54 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78  CT ){.    pIndex
1bd50 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69  ->aColExpr = pLi
1bd60 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  st;.    pList = 
1bd70 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
1bd80 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ; i<pIndex->nKey
1bd90 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  Col; i++, pListI
1bda0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
1bdb0 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20   *pCExpr;       
1bdc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bdd0 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70  e i-th index exp
1bde0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ression */.    i
1bdf0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
1be00 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  Order;        /*
1be10 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20   ASC or DESC on 
1be20 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73  the i-th express
1be30 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
1be40 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
1be50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1be60 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1be70 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  name */..    sql
1be80 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
1be90 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
1bea0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
1beb0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1bec0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1bed0 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73  NC_IdxExpr, pLis
1bee0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29  tItem->pExpr, 0)
1bef0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
1bf00 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
1bf10 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1bf20 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71  .    pCExpr = sq
1bf30 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1bf40 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e  late(pListItem->
1bf50 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
1bf60 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  pCExpr->op!=TK_C
1bf70 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69  OLUMN ){.      i
1bf80 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
1bf90 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
1bfa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1bfb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
1bfc0 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69  xpressions prohi
1bfd0 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59  bited in PRIMARY
1bfe0 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20   KEY and ".     
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c000 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51             "UNIQ
1c010 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  UE constraints")
1c020 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1c030 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c050 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  if( pIndex->aCol
1c060 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
1c070 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45     pIndex->aColE
1c080 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  xpr = pList;.   
1c090 20 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a       pList = 0;.
1c0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
1c0b0 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1c0c0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1c0d0 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a  n[i] = XN_EXPR;.
1c0e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e        pIndex->un
1c0f0 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20  iqNotNull = 0;. 
1c100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c110 6a 20 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c  j = pCExpr->iCol
1c120 75 6d 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  umn;.      asser
1c130 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  t( j<=0x7fff );.
1c140 20 20 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b        if( j<0 ){
1c150 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61  .        j = pTa
1c160 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1c170 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
1c180 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
1c190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1c1a0 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1c1b0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 0;.      }. 
1c1c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1c1d0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
1c1e0 6a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f  j;.    }.    zCo
1c1f0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ll = 0;.    if( 
1c200 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1c210 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1c220 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43   ){.      int nC
1c230 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  oll;.      zColl
1c240 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
1c250 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1c260 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
1c270 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
1c280 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
1c290 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
1c2a0 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
1c2b0 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
1c2c0 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
1c2d0 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
1c2e0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
1c2f0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
1c300 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
1c310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e      }else if( j>
1c320 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  =0 ){.      zCol
1c330 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
1c340 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20  ].zColl;.    }. 
1c350 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
1c360 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  zColl = sqlite3S
1c370 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66  trBINARY;.    if
1c380 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
1c390 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
1c3a0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1c3b0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
1c3c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1c3d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
1c3e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1c3f0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
1c400 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
1c410 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
1c420 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
1c430 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
1c440 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1c450 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
1c460 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1c470 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
1c480 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79  nd the table key
1c490 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1c4a0 68 65 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57  he index.  For W
1c4b0 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a  ITHOUT ROWID.  *
1c4c0 2a 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70  * tables (when p
1c4d0 50 6b 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c  Pk!=0) this will
1c4e0 20 62 65 20 74 68 65 20 64 65 63 6c 61 72 65 64   be the declared
1c4f0 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46   PRIMARY KEY.  F
1c500 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74  or.  ** normal t
1c510 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d  ables (when pPk=
1c520 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65  =0) this will be
1c530 20 74 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f   the rowid..  */
1c540 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
1c550 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
1c560 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
1c570 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
1c580 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
1c590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78  .      assert( x
1c5a0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
1c5b0 20 69 73 44 75 70 43 6f 6c 75 6d 6e 28 70 49 6e   isDupColumn(pIn
1c5c0 64 65 78 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  dex, pIndex->nKe
1c5d0 79 43 6f 6c 2c 20 70 50 6b 2c 20 6a 29 20 29 7b  yCol, pPk, j) ){
1c5e0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1c5f0 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20  >nColumn--; .   
1c600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c610 20 20 74 65 73 74 63 61 73 65 28 20 68 61 73 43    testcase( hasC
1c620 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69  olumn(pIndex->ai
1c630 43 6f 6c 75 6d 6e 2c 70 49 6e 64 65 78 2d 3e 6e  Column,pIndex->n
1c640 4b 65 79 43 6f 6c 2c 78 29 20 29 3b 0a 20 20 20  KeyCol,x) );.   
1c650 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1c660 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20  olumn[i] = x;.  
1c670 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a        pIndex->az
1c680 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[i] = pPk->a
1c690 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  zColl[j];.      
1c6a0 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
1c6b0 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  rder[i] = pPk->a
1c6c0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
1c6d0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1c6e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1c6f0 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e  ert( i==pIndex->
1c700 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c  nColumn );.  }el
1c710 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  se{.    pIndex->
1c720 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1c730 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64  _ROWID;.    pInd
1c740 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1c750 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1c760 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1c770 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
1c780 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
1c790 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
1c7a0 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
1c7b0 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
1c7c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
1c7d0 65 78 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72  ex contains ever
1c7e0 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20  y column of its 
1c7f0 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b  table, then mark
1c800 0a 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f  .  ** it as a co
1c810 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1c820 20 20 61 73 73 65 72 74 28 20 48 61 73 52 6f 77    assert( HasRow
1c830 69 64 28 70 54 61 62 29 20 0a 20 20 20 20 20 20  id(pTab) .      
1c840 7c 7c 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  || pTab->iPKey<0
1c850 20 7c 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d   || sqlite3Colum
1c860 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c  nOfIndex(pIndex,
1c870 20 70 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30   pTab->iPKey)>=0
1c880 20 29 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43   );.  recomputeC
1c890 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64  olumnsNotIndexed
1c8a0 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1c8b0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70  pTblName!=0 && p
1c8c0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d  Index->nColumn>=
1c8d0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
1c8e0 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65    pIndex->isCove
1c8f0 72 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f  ring = 1;.    fo
1c900 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
1c910 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
1c920 20 69 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50   if( j==pTab->iP
1c930 4b 65 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Key ) continue;.
1c940 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c950 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70  3ColumnOfIndex(p
1c960 49 6e 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f  Index,j)>=0 ) co
1c970 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49  ntinue;.      pI
1c980 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67  ndex->isCovering
1c990 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1c9a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
1c9b0 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
1c9c0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
1c9d0 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
1c9e0 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
1c9f0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
1ca00 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1ca10 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
1ca20 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
1ca30 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
1ca40 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
1ca50 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
1ca60 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
1ca70 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
1ca80 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
1ca90 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
1caa0 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
1cab0 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
1cac0 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
1cad0 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
1cae0 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
1caf0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
1cb00 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
1cb10 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
1cb20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
1cb30 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
1cb40 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
1cb50 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
1cb60 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
1cb70 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
1cb80 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
1cb90 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
1cba0 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
1cbb0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
1cbc0 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
1cbd0 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
1cbe0 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
1cbf0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
1cc00 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  dices..    **.  
1cc10 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20    ** Two UNIQUE 
1cc20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1cc30 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63  onstraints are c
1cc40 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61  onsidered equiva
1cc50 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64  lent.    ** (and
1cc60 20 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e   thus suppressin
1cc70 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65  g the second one
1cc80 29 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68  ) even if they h
1cc90 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20  ave different.  
1cca0 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73    ** sort orders
1ccb0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ccc0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66  If there are dif
1ccd0 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67  ferent collating
1cce0 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66   sequences or if
1ccf0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a   the columns of.
1cd00 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74      ** the const
1cd10 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64  raint occur in d
1cd20 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c  ifferent orders,
1cd30 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72   then the constr
1cd40 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a  aints are.    **
1cd50 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74   considered dist
1cd60 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65  inct and both re
1cd70 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65  sult in separate
1cd80 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f   indices..    */
1cd90 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1cda0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1cdb0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
1cdc0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
1cdd0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
1cde0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
1cdf0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1ce00 49 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73  Idx) );.      as
1ce10 73 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54  sert( pIdx->idxT
1ce20 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
1ce30 59 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20  YPE_APPDEF );.  
1ce40 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1ce50 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78  iqueIndex(pIndex
1ce60 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1ce70 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70  pIdx->nKeyCol!=p
1ce80 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  Index->nKeyCol )
1ce90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cea0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78   for(k=0; k<pIdx
1ceb0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b  ->nKeyCol; k++){
1cec0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1ced0 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20  har *z1;.       
1cee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b   const char *z2;
1cef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1cf00 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
1cf10 6b 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k]>=0 );.       
1cf20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
1cf30 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
1cf40 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
1cf50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20  eak;.        z1 
1cf60 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
1cf70 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20  ];.        z2 = 
1cf80 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  pIndex->azColl[k
1cf90 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
1cfa0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
1cfb0 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
1cfc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cfd0 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
1cfe0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
1cff0 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
1d000 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1d010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1d020 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
1d030 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
1d040 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
1d050 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
1d060 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
1d070 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
1d080 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
1d090 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1d0a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
1d0b0 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
1d0c0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
1d0d0 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
1d0e0 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
1d0f0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1d100 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
1d110 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
1d120 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
1d130 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
1d140 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
1d150 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
1d160 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
1d170 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
1d180 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
1d190 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
1d1a0 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
1d1b0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
1d1c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
1d1d0 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
1d1e0 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
1d1f0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1d200 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
1d210 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d220 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d230 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
1d240 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
1d250 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
1d260 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
1d270 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
1d280 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1d290 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
1d2a0 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
1d2b0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
1d2c0 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
1d2d0 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
1d2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d2f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78  .        if( idx
1d300 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58  Type==SQLITE_IDX
1d310 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20  TYPE_PRIMARYKEY 
1d320 29 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20  ) pIdx->idxType 
1d330 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20  = idxType;.     
1d340 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
1d350 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
1d360 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1d370 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  xt = pParse->pNe
1d380 77 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  wIndex;.        
1d390 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e    pParse->pNewIn
1d3a0 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1d3b0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d          pIndex =
1d3c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1d3d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1d3e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1d3f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d400 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d  .  if( !IN_RENAM
1d410 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20  E_OBJECT ){..   
1d420 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77   /* Link the new
1d430 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
1d440 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e   to its table an
1d450 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20  d to the other. 
1d460 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20     ** in-memory 
1d470 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1d480 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  res. .    */.   
1d490 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1d4a0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20  >nErr==0 );.    
1d4b0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1d4c0 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  y ){.      Index
1d4d0 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72   *p;.      asser
1d4e0 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50  t( !IN_SPECIAL_P
1d4f0 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73  ARSE );.      as
1d500 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1d510 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1d520 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1d530 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ema) );.      if
1d540 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1d550 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1d560 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1d570 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20  .newTnum;.      
1d580 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
1d590 65 78 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f  exHasDuplicateRo
1d5a0 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29 20 29  otPage(pIndex) )
1d5b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1d5c0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d5d0 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f  se, "invalid roo
1d5e0 74 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20  tpage");.       
1d5f0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d600 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d610 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
1d620 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1d630 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d  index;.        }
1d640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1d650 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
1d660 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
1d670 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
1d680 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65  .          pInde
1d690 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  x->zName, pIndex
1d6a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20 29  );.      if( p )
1d6b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1d6c0 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
1d6d0 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
1d6e0 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
1d6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
1d700 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
1d710 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1d720 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1d730 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62   }.      db->mDb
1d740 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f  Flags |= DBFLAG_
1d750 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  SchemaChange;.  
1d760 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1d770 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
1d780 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
1d790 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
1d7a0 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
1d7b0 65 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69  e.    ** index i
1d7c0 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64  s an implied ind
1d7d0 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20  ex for a UNIQUE 
1d7e0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1d7f0 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a  onstraint) then.
1d800 20 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65      ** emit code
1d810 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
1d820 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20   index rootpage 
1d830 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65  on disk and make
1d840 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20   an entry for.  
1d850 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1d860 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1d870 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1d880 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1d890 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e   with.    ** con
1d8a0 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e  tent.  But, do n
1d8b0 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65  ot do this if we
1d8c0 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64   are simply read
1d8d0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
1d8e0 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62  aster.    ** tab
1d8f0 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20  le to parse the 
1d900 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68  schema, or if th
1d910 69 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20  is index is the 
1d920 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
1d930 78 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49  x.    ** of a WI
1d940 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1d950 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d960 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
1d970 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
1d980 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
1d990 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
1d9a0 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a  RIMARY KEY.    *
1d9b0 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  * or UNIQUE inde
1d9c0 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  x in a CREATE TA
1d9d0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
1d9e0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
1d9f0 20 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20      ** has just 
1da00 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
1da10 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
1da20 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
1da30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
1da40 20 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62     ** step can b
1da50 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a  e skipped..    *
1da60 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48  /.    else if( H
1da70 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
1da80 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
1da90 20 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20        Vdbe *v;. 
1daa0 20 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74       char *zStmt
1dab0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d  ;.      int iMem
1dac0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1dad0 6d 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71  m;..      v = sq
1dae0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1daf0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
1db00 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
1db10 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
1db20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1db30 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1db40 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1db50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ;..      /* Crea
1db60 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
1db70 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73  for the index us
1db80 69 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e  ing CreateIndex.
1db90 20 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20   But before.    
1dba0 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63    ** doing so, c
1dbb0 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72  ode a Noop instr
1dbc0 75 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  uction and store
1dbd0 20 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20   its address in 
1dbe0 0a 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e  .      ** Index.
1dbf0 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65  tnum. This is re
1dc00 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74  quired in case t
1dc10 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74  his index is act
1dc20 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a  ually a .      *
1dc30 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e  * PRIMARY KEY an
1dc40 64 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  d the table is a
1dc50 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55  ctually a WITHOU
1dc60 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49  T ROWID table. I
1dc70 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  n .      ** that
1dc80 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1dc90 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1dca0 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1dcb0 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1dcc0 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69    ** the Noop wi
1dcd0 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d  th a Goto to jum
1dce0 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20  p over the VDBE 
1dcf0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1dd00 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70  elow. */.      p
1dd10 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71  Index->tnum = sq
1dd20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1dd30 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  v, OP_Noop);.   
1dd40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dd50 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp3(v, OP_Creat
1dd60 65 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65  eBtree, iDb, iMe
1dd70 6d 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  m, BTREE_BLOBKEY
1dd80 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74  );..      /* Gat
1dd90 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  her the complete
1dda0 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
1ddb0 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1ddc0 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ent into.      *
1ddd0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
1dde0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
1ddf0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1de00 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  {.        int n 
1de10 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1de20 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1de30 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1de40 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1de50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61  .        if( pNa
1de60 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20  me->z[n-1]==';' 
1de70 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f  ) n--;.        /
1de80 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
1de90 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
1dea0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1deb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
1dec0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
1ded0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
1dee0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
1def0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *s",.           
1df00 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
1df10 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
1df20 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29  E", n, pName->z)
1df30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1df40 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74         /* An aut
1df50 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
1df60 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
1df70 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1df80 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1df90 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1dfa0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1dfb0 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20  ""); */.        
1dfc0 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  zStmt = 0;.     
1dfd0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64   }..      /* Add
1dfe0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
1dff0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
1e000 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20  his index.      
1e010 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1e020 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1e030 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
1e040 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25  INSERT INTO %Q.%
1e050 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27  s VALUES('index'
1e060 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22  ,%Q,%Q,#%d,%Q);"
1e070 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ,.          db->
1e080 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1e090 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a  e, MASTER_NAME,.
1e0a0 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
1e0b0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
1e0c0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
1e0d0 20 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a            iMem,.
1e0e0 20 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a            zStmt.
1e0f0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1e100 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e110 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
1e120 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
1e130 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20  index with data 
1e140 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20  and reparse the 
1e150 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20  schema. Code an 
1e160 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20  OP_Expire.      
1e170 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
1e180 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65   all pre-compile
1e190 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
1e1a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1e1b0 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1e1c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
1e1d0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
1e1e0 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20  pIndex, iMem);. 
1e1f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68         sqlite3Ch
1e200 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1e210 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  e, iDb);.       
1e220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1e230 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1e240 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1e250 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1e260 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41  db, "name='%q' A
1e270 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1e280 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1e290 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e2a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e2b0 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29  OP_Expire, 0, 1)
1e2c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1e2d0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1e2e0 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1e2f0 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tnum);.    }.  }
1e300 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1e310 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1e320 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1e330 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1e340 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1e350 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1e360 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1e370 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1e380 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1e390 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1e3a0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1e3b0 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1e3c0 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1e3d0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1e3e0 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1e3f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1e400 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1e410 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1e420 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1e430 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1e440 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1e450 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1e460 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1e470 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1e480 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1e490 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1e4a0 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1e4b0 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1e4c0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1e4d0 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1e4e0 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1e4f0 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1e500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e510 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1e520 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1e530 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1e540 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1e550 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1e560 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1e570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1e580 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1e590 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1e5a0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1e5b0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1e5c0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1e5d0 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1e5e0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
1e5f0 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  = 0;.  }.  else 
1e600 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
1e610 4a 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65  JECT ){.    asse
1e620 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
1e630 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1e640 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1e650 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1e660 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1e670 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1e680 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1e690 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1e6a0 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1e6b0 20 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e   ) sqlite3FreeIn
1e6c0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1e6d0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1e6e0 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1e6f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1e700 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1e710 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1e720 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1e730 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1e740 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e750 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zName);.}../*.
1e760 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
1e770 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
1e780 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
1e790 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
1e7a0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
1e7b0 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
1e7c0 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
1e7d0 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
1e7e0 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
1e7f0 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20  [0] is supposed 
1e800 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1e810 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1e820 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1e830 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1e840 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1e850 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1e860 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1e870 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1e880 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1e890 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1e8a0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1e8b0 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1e8c0 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1e8d0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1e8e0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1e8f0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1e900 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1e910 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1e920 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1e930 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74  combination of t
1e940 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
1e950 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
1e960 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
1e970 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
1e980 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
1e990 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
1e9a0 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
1e9b0 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
1e9c0 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1e9d0 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
1e9e0 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
1e9f0 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
1ea00 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
1ea10 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
1ea20 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
1ea30 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
1ea40 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
1ea50 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
1ea60 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
1ea70 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
1ea80 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
1ea90 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
1eaa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
1eab0 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
1eac0 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20   *pIdx){.  /*   
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c               10,
1eae0 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20    9,  8,  7,  6 
1eaf0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c  */.  LogEst aVal
1eb00 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33  [] = { 33, 32, 3
1eb10 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c  0, 28, 26 };.  L
1eb20 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d  ogEst *a = pIdx-
1eb30 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  >aiRowLogEst;.  
1eb40 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28  int nCopy = MIN(
1eb50 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c  ArraySize(aVal),
1eb60 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b   pIdx->nKeyCol);
1eb70 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
1eb80 49 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66  Indexes with def
1eb90 61 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74  ault row estimat
1eba0 65 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  es should not ha
1ebb0 76 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f  ve stat1 data */
1ebc0 0a 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78  .  assert( !pIdx
1ebd0 2d 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20  ->hasStat1 );.. 
1ebe0 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73   /* Set the firs
1ebf0 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20  t entry (number 
1ec00 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69  of rows in the i
1ec10 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74  ndex) to the est
1ec20 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d  imated .  ** num
1ec30 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1ec40 68 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c  he table, or hal
1ec50 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1ec60 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1ec70 65 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72  e.  ** for a par
1ec80 74 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75  tial index.   Bu
1ec90 74 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  t do not let the
1eca0 20 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62   estimate drop b
1ecb0 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b  elow 10. */.  a[
1ecc0 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  0] = pIdx->pTabl
1ecd0 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  e->nRowLogEst;. 
1ece0 20 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74   if( pIdx->pPart
1ecf0 49 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b  IdxWhere!=0 ) a[
1ed00 30 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72  0] -= 10;  asser
1ed10 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
1ed20 67 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28  gEst(2) );.  if(
1ed30 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1ed40 3d 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 33;           
1ed50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33         assert( 3
1ed60 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  3==sqlite3LogEst
1ed70 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73  (10) );..  /* Es
1ed80 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d  timate that a[1]
1ed90 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20   is 10, a[2] is 
1eda0 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b  9, a[3] is 8, a[
1edb0 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73  4] is 7, a[5] is
1edc0 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68  .  ** 6 and each
1edd0 20 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75   subsequent valu
1ede0 65 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e  e (if any) is 5.
1edf0 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61    */.  memcpy(&a
1ee00 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79  [1], aVal, nCopy
1ee10 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29  *sizeof(LogEst))
1ee20 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b  ;.  for(i=nCopy+
1ee30 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79  1; i<=pIdx->nKey
1ee40 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Col; i++){.    a
1ee50 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20  [i] = 23;       
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1ee70 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33  ert( 23==sqlite3
1ee80 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d  LogEst(5) );.  }
1ee90 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73  ..  assert( 0==s
1eea0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
1eeb0 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
1eec0 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61  eIndex(pIdx) ) a
1eed0 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20  [pIdx->nKeyCol] 
1eee0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
1eef0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1ef00 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67  drop an existing
1ef10 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54   named index.  T
1ef20 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
1ef30 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52  mplements the DR
1ef40 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  OP INDEX stateme
1ef50 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1ef60 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72  te3DropIndex(Par
1ef70 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
1ef80 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
1ef90 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64  ifExists){.  Ind
1efa0 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64  ex *pIndex;.  Vd
1efb0 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
1efc0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1efd0 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
1efe0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1eff0 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a  >nErr==0 );   /*
1f000 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69   Never called wi
1f010 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20  th prior errors 
1f020 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
1f030 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1f040 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1f050 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73  index;.  }.  ass
1f060 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
1f070 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  ==1 );.  if( SQL
1f080 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
1f090 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
1f0a0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1f0b0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1f0c0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1f0d0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1f0e0 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  b, pName->a[0].z
1f0f0 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  Name, pName->a[0
1f100 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1f110 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b  if( pIndex==0 ){
1f120 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73  .    if( !ifExis
1f130 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts ){.      sqli
1f140 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f150 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1f160 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20  ex: %S", pName, 
1f170 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
1f180 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1f190 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
1f1a0 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
1f1b0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1f1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
1f1d0 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
1f1e0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  = 1;.    goto ex
1f1f0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1f200 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d   }.  if( pIndex-
1f210 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1f220 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1f230 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1f240 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1f250 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
1f260 20 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20   with UNIQUE ". 
1f270 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59       "or PRIMARY
1f280 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
1f290 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  cannot be droppe
1f2a0 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  d", 0);.    goto
1f2b0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1f2c0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
1f2d0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1f2e0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70  ex(db, pIndex->p
1f2f0 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66  Schema);.#ifndef
1f300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f310 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
1f320 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51     int code = SQ
1f330 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b  LITE_DROP_INDEX;
1f340 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1f350 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
1f360 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1f370 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
1f380 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
1f390 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f3a0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
1f3b0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
1f3c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1f3d0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1f3e0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
1f3f0 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1f400 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1f410 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1f420 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1f430 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
1f440 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
1f450 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1f460 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1f470 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1f480 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1f490 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
1f4a0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1f4b0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1f4c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1f4d0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
1f4e0 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
1f4f0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
1f500 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
1f510 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
1f520 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1f530 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1f540 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1f550 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1f560 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1f570 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1f580 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1f590 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
1f5a0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
1f5b0 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
1f5c0 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
1f5d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1f5e0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
1f5f0 41 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  AME, pIndex->zNa
1f600 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
1f610 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
1f620 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
1f630 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d  , "idx", pIndex-
1f640 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1f650 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
1f660 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1f670 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
1f680 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ge(pParse, pInde
1f690 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
1f6a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f6b0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49  dOp4(v, OP_DropI
1f6c0 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c  ndex, iDb, 0, 0,
1f6d0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1f6e0 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  0);.  }..exit_dr
1f6f0 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69  op_index:.  sqli
1f700 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1f710 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
1f720 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20  /*.** pArray is 
1f730 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1f740 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  array of objects
1f750 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  . Each object in
1f760 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73   the.** array is
1f770 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69   szEntry bytes i
1f780 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75  n size. This rou
1f790 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65  tine uses sqlite
1f7a0 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20  3DbRealloc().** 
1f7b0 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72  to extend the ar
1f7c0 72 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72  ray so that ther
1f7d0 65 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61  e is space for a
1f7e0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74   new object at t
1f7f0 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  he end..**.** Wh
1f800 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f810 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45   is called, *pnE
1f820 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  ntry contains th
1f830 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1f840 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28  f.** the array (
1f850 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20  in entries - so 
1f860 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  the allocation i
1f870 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20  s ((*pnEntry) * 
1f880 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a  szEntry) bytes.*
1f890 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a  * in total)..**.
1f8a0 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f  ** If the reallo
1f8b0 63 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75  c() is successfu
1f8c0 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f  l (i.e. if no OO
1f8d0 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75  M condition occu
1f8e0 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63  rs), the.** spac
1f8f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
1f900 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1f910 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74  s zeroed, *pnEnt
1f920 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a  ry updated to.**
1f930 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77   reflect the new
1f940 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1f950 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ay and a pointer
1f960 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   to the new allo
1f970 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  cation.** return
1f980 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74  ed. *pIdx is set
1f990 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
1f9a0 20 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65   the new array e
1f9b0 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  ntry in this cas
1f9c0 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
1f9d0 73 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c  se, if the reall
1f9e0 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64  oc() fails, *pId
1f9f0 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20  x is set to -1, 
1fa00 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73  *pnEntry remains
1fa10 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  .** unchanged an
1fa20 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72  d a copy of pArr
1fa30 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ay returned..*/.
1fa40 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72  void *sqlite3Arr
1fa50 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71  ayAllocate(.  sq
1fa60 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1fa70 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1fa80 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1fa90 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1faa0 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20  void *pArray,   
1fab0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62    /* Array of ob
1fac0 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65  jects.  Might be
1fad0 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a   reallocated */.
1fae0 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20    int szEntry,  
1faf0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65      /* Size of e
1fb00 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1fb10 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  e array */.  int
1fb20 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f   *pnEntry,     /
1fb30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  * Number of obje
1fb40 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  cts currently in
1fb50 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   use */.  int *p
1fb60 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57  Idx         /* W
1fb70 72 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f  rite the index o
1fb80 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72  f a new slot her
1fb90 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  e */.){.  char *
1fba0 7a 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  z;.  sqlite3_int
1fbb0 36 34 20 6e 20 3d 20 2a 70 49 64 78 20 3d 20 2a  64 n = *pIdx = *
1fbc0 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1fbd0 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1fbe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
1fbf0 36 34 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  64 sz = (n==0) ?
1fc00 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
1fc10 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
1fc20 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1fc30 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
1fc40 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
1fc50 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
1fc60 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
1fc70 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
1fc80 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
1fc90 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
1fca0 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
1fcb0 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
1fcc0 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
1fcd0 45 6e 74 72 79 29 3b 0a 20 20 2b 2b 2a 70 6e 45  Entry);.  ++*pnE
1fce0 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
1fcf0 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
1fd00 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
1fd10 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
1fd20 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
1fd30 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
1fd40 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
1fd50 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
1fd60 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
1fd70 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
1fd80 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
1fd90 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
1fda0 74 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70  tAppend(Parse *p
1fdb0 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70  Parse, IdList *p
1fdc0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
1fdd0 6b 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ken){.  sqlite3 
1fde0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1fdf0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1fe00 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
1fe10 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1fe20 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1fe30 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
1fe40 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1fe50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1fe60 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d    }.  pList->a =
1fe70 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c   sqlite3ArrayAll
1fe80 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c  ocate(.      db,
1fe90 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c  .      pList->a,
1fea0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c  .      sizeof(pL
1feb0 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20  ist->a[0]),.    
1fec0 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20    &pList->nId,. 
1fed0 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69       &i.  );.  i
1fee0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71  f( i<0 ){.    sq
1fef0 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1ff00 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1ff10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1ff20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
1ff30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1ff40 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1ff50 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e  Token);.  if( IN
1ff60 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26  _RENAME_OBJECT &
1ff70 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  & pList->a[i].zN
1ff80 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ame ){.    sqlit
1ff90 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
1ffa0 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
1ffb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1ffc0 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  e, pToken);.  }.
1ffd0 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1ffe0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1fff0 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
20000 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
20010 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
20020 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
20030 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
20040 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
20050 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
20060 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
20070 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
20080 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
20090 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
200a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
200b0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
200c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
200d0 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
200e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
200f0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
20100 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
20110 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
20120 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
20130 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
20140 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
20150 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
20160 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
20170 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
20180 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
20190 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
201a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
201b0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
201c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
201d0 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
201e0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
201f0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
20200 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
20210 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
20220 69 7a 65 20 6f 66 20 61 20 53 72 63 4c 69 73 74  ize of a SrcList
20230 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20   object..** The 
20240 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 69  SrcList object i
20250 73 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  s used to repres
20260 65 6e 74 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  ent the FROM cla
20270 75 73 65 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  use of a.** SELE
20280 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e  CT statement, an
20290 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  d the query plan
202a0 6e 65 72 20 63 61 6e 6e 6f 74 20 64 65 61 6c 20  ner cannot deal 
202b0 77 69 74 68 20 6d 6f 72 65 0a 2a 2a 20 74 68 61  with more.** tha
202c0 6e 20 36 34 20 74 61 62 6c 65 73 20 69 6e 20 61  n 64 tables in a
202d0 20 6a 6f 69 6e 2e 20 20 53 6f 20 61 6e 79 20 76   join.  So any v
202e0 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61 6e  alue larger than
202f0 20 36 34 20 68 65 72 65 0a 2a 2a 20 69 73 20 73   64 here.** is s
20300 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 6d 6f  ufficient for mo
20310 73 74 20 75 73 65 73 2e 20 20 53 6d 61 6c 6c 65  st uses.  Smalle
20320 72 20 76 61 6c 75 65 73 2c 20 6c 69 6b 65 20 73  r values, like s
20330 61 79 20 31 30 2c 20 61 72 65 0a 2a 2a 20 61 70  ay 10, are.** ap
20340 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 73 6d  propriate for sm
20350 61 6c 6c 20 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c  all and memory-l
20360 69 6d 69 74 65 64 20 61 70 70 6c 69 63 61 74 69  imited applicati
20370 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ons..*/.#ifndef 
20380 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49  SQLITE_MAX_SRCLI
20390 53 54 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  ST.# define SQLI
203a0 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 32  TE_MAX_SRCLIST 2
203b0 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  00.#endif../*.**
203c0 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63   Expand the spac
203d0 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
203e0 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
203f0 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63  t object by.** c
20400 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e  reating nExtra n
20410 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69  ew slots beginni
20420 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69  ng at iStart.  i
20430 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61  Start is zero ba
20440 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74  sed..** New slot
20450 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  s are zeroed..**
20460 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
20470 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69   suppose a SrcLi
20480 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e  st initially con
20490 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65  tains two entrie
204a0 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70  s: A,B..** To ap
204b0 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69  pend 3 new entri
204c0 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c  es onto the end,
204d0 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   do this:.**.** 
204e0 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
204f0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
20500 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a  clist, 3, 2);.**
20510 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61  .** After the ca
20520 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c  ll above it woul
20530 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42  d contain:  A, B
20540 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e  , nil, nil, nil.
20550 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72  .** If the iStar
20560 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62  t argument had b
20570 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66  een 1 instead of
20580 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73   2, then the res
20590 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76  ult.** would hav
205a0 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c  e been:  A, nil,
205b0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54   nil, nil, B.  T
205c0 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65  o prepend the ne
205d0 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20  w slots,.** the 
205e0 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75  iStart value wou
205f0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65  ld be 0.  The re
20600 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a  sult then would.
20610 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c  ** be: nil, nil,
20620 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a   nil, A, B..**.*
20630 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
20640 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f  location fails o
20650 72 20 74 68 65 20 53 72 63 4c 69 73 74 20 62 65  r the SrcList be
20660 63 6f 6d 65 73 20 74 6f 6f 20 6c 61 72 67 65 2c  comes too large,
20670 20 6c 65 61 76 65 0a 2a 2a 20 74 68 65 20 6f 72   leave.** the or
20680 69 67 69 6e 61 6c 20 53 72 63 4c 69 73 74 20 75  iginal SrcList u
20690 6e 63 68 61 6e 67 65 64 2c 20 72 65 74 75 72 6e  nchanged, return
206a0 20 4e 55 4c 4c 2c 20 61 6e 64 20 6c 65 61 76 65   NULL, and leave
206b0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
206c0 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2e 0a  e.** in pParse..
206d0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
206e0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
206f0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
20700 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
20710 6e 67 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20  ng context into 
20720 77 68 69 63 68 20 65 72 72 6f 72 73 20 61 72 65  which errors are
20730 20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53   reported */.  S
20740 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
20750 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
20760 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
20770 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
20780 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20790 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
207a0 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
207b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
207c0 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
207d0 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
207e0 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
207f0 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
20800 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
20810 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
20820 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
20830 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
20840 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
20850 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
20860 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
20870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
20880 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
20890 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
208a0 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
208b0 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
208c0 0a 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63  .  if( (u32)pSrc
208d0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
208e0 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
208f0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
20900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
20910 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 32 2a 28 73  64 nAlloc = 2*(s
20920 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 53 72  qlite3_int64)pSr
20930 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
20940 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
20950 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
20960 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72     if( pSrc->nSr
20970 63 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49 54 45  c+nExtra>=SQLITE
20980 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 7b 0a  _MAX_SRCLIST ){.
20990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
209a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
209b0 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63 6c 61  oo many FROM cla
209c0 75 73 65 20 74 65 72 6d 73 2c 20 6d 61 78 3a 20  use terms, max: 
209d0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
209e0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
209f0 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29 3b 0a  E_MAX_SRCLIST);.
20a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
20a10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
20a20 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  lloc>SQLITE_MAX_
20a30 53 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c 6f 63  SRCLIST ) nAlloc
20a40 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52   = SQLITE_MAX_SR
20a50 43 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65 77 20  CLIST;.    pNew 
20a60 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
20a70 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
20a80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
20a90 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
20aa0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
20ab0 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
20ac0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
20ae0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20af0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
20b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
20b10 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 53 72   = pNew;.    pSr
20b20 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c  c->nAlloc = nAll
20b30 6f 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  oc;.  }..  /* Mo
20b40 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74  ve existing slot
20b50 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65  s that come afte
20b60 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  r the newly inse
20b70 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20  rted slots.  ** 
20b80 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a  out of the way *
20b90 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e  /.  for(i=pSrc->
20ba0 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72  nSrc-1; i>=iStar
20bb0 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72  t; i--){.    pSr
20bc0 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d  c->a[i+nExtra] =
20bd0 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d   pSrc->a[i];.  }
20be0 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d  .  pSrc->nSrc +=
20bf0 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a   nExtra;..  /* Z
20c00 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
20c10 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
20c20 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
20c30 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
20c40 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
20c50 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
20c60 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
20c70 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
20c80 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
20c90 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
20ca0 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
20cb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
20cc0 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
20cd0 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
20ce0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
20cf0 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
20d00 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
20d10 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
20d20 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
20d30 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
20d40 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
20d50 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
20d60 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
20d70 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a  pTable is NULL..
20d80 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
20d90 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
20da0 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
20db0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 72   an OOM error or
20dc0 20 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c 69   if the.** SrcLi
20dd0 73 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72 67  st grows to larg
20de0 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  e.  The returned
20df0 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
20e00 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
20e10 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
20e20 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
20e30 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
20e40 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
20e50 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
20e60 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
20e70 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
20e80 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
20e90 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
20ea0 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
20eb0 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
20ec0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
20ed0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
20ee0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
20ef0 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
20f00 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
20f10 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
20f20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
20f30 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
20f40 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
20f50 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
20f60 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
20f70 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
20f80 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
20f90 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
20fa0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
20fb0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
20fc0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
20fd0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
20fe0 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
20ff0 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
21000 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
21010 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
21020 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
21030 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
21040 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
21050 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
21060 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
21070 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
21080 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
21090 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
210a0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
210b0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
210c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
210d0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
210e0 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
210f0 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
21100 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
21110 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
21120 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
21130 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
21140 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
21150 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
21160 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
21170 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
21180 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
21190 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
211a0 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
211b0 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
211c0 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
211d0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
211e0 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
211f0 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
21200 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21210 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
21220 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
21230 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
21240 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
21250 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
21260 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
21270 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
21280 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
21290 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
212a0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
212b0 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50  cListAppend(.  P
212c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
212d0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
212e0 6e 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68 20  ntext, in which 
212f0 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f 72  errors are repor
21300 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ted */.  SrcList
21310 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
21320 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53  Append to this S
21330 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65  rcList. NULL cre
21340 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69  ates a new SrcLi
21350 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  st */.  Token *p
21360 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54  Table,      /* T
21370 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  able to append *
21380 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
21390 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62  base    /* Datab
213a0 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ase of the table
213b0 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
213c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
213d0 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tem;.  sqlite3 *
213e0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  db;.  assert( pD
213f0 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
21400 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
21410 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
21420 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73 65  hout B */.  asse
21430 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
21440 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
21450 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64 62  e->db!=0 );.  db
21460 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21470 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
21480 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
21490 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
214a0 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
214b0 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
214c0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
214d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
214e0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
214f0 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  = 1;.    pList->
21500 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d 65  nSrc = 1;.    me
21510 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b 30  mset(&pList->a[0
21520 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c 69  ], 0, sizeof(pLi
21530 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
21540 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  pList->a[0].iCur
21550 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  sor = -1;.  }els
21560 65 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  e{.    SrcList *
21570 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 72  pNew = sqlite3Sr
21580 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50 61  cListEnlarge(pPa
21590 72 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70  rse, pList, 1, p
215a0 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 20  List->nSrc);.   
215b0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
215c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
215d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
215e0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74  List);.      ret
215f0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
21600 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
21610 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pNew;.    }.  }.
21620 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
21630 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
21640 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
21650 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
21660 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
21670 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
21680 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
21690 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
216a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
216b0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
216c0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
216d0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
216e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
216f0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
21700 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
21710 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
21720 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
21730 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
21740 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
21750 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
21760 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
21770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
21780 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
21790 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
217a0 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
217b0 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
217c0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
217d0 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
217e0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
217f0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
21800 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
21810 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
21820 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
21830 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
21840 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
21850 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
21860 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
21870 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
21880 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
21890 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
218a0 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
218b0 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
218c0 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
218d0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
218e0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
218f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
21900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
21910 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
21920 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
21930 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
21940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21950 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
21960 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
21970 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
21980 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
21990 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
219a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
219b0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
219c0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
219d0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
219e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
219f0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
21a00 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
21a10 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
21a20 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
21a30 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
21a40 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
21a50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21a60 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
21a70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
21a80 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
21a90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
21aa0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
21ab0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
21ac0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
21ad0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
21ae0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21af0 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
21b00 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
21b10 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
21b20 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
21b30 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
21b40 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
21b50 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
21b60 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
21b70 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
21b80 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
21b90 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
21ba0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
21bb0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
21bc0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
21bd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
21be0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
21bf0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
21c00 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
21c10 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
21c20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
21c30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
21c40 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
21c50 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
21c60 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
21c70 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
21c80 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
21c90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
21ca0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
21cb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
21cc0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
21cd0 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
21ce0 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
21cf0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
21d00 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
21d10 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
21d20 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
21d30 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
21d40 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
21d50 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
21d60 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
21d70 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
21d80 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
21d90 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
21da0 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
21db0 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
21dc0 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
21dd0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
21de0 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
21df0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
21e00 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
21e10 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
21e20 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
21e30 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
21e40 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
21e50 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
21e60 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
21e70 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
21e80 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
21e90 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
21ea0 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
21eb0 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
21ec0 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
21ed0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
21ee0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
21ef0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
21f00 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
21f10 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
21f20 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
21f30 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
21f40 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
21f50 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
21f60 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
21f70 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
21f80 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
21f90 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
21fa0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
21fb0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21fd0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
21fe0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21ff0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
22000 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
22010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22020 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
22030 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
22040 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
22050 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
22060 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
22080 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
22090 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
220a0 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
220b0 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
220c0 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
220d0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
220e0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
220f0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
22100 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
22110 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
22120 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
22130 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
22140 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
22150 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
22160 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
22170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22180 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
22190 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
221a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
221b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
221c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
221d0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
221e0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
221f0 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
22200 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22210 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
22220 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
22230 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
22240 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
22250 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
22260 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
22270 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
22280 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
22290 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
222a0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
222b0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
222c0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
222d0 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
222e0 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
222f0 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20   p->nSrc>0 );.  
22300 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d  pItem = &p->a[p-
22310 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65  >nSrc-1];.  asse
22320 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29 3d  rt( (pTable==0)=
22330 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29 20  =(pDatabase==0) 
22340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
22350 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20  em->zName==0 || 
22360 70 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b 0a  pDatabase!=0 );.
22370 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
22380 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d 2d  OBJECT && pItem-
22390 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54 6f  >zName ){.    To
223a0 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28 41  ken *pToken = (A
223b0 4c 57 41 59 53 28 70 44 61 74 61 62 61 73 65 29  LWAYS(pDatabase)
223c0 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
223d0 29 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20  ) ? pDatabase : 
223e0 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  pTable;.    sqli
223f0 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61  te3RenameTokenMa
22400 70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  p(pParse, pItem-
22410 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  >zName, pToken);
22420 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
22430 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66  Alias!=0 );.  if
22440 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  ( pAlias->n ){. 
22450 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
22460 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
22470 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
22480 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
22490 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
224a0 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
224b0 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
224c0 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
224d0 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
224e0 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  .. append_from_e
224f0 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20  rror:.  assert( 
22500 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  p==0 );.  sqlite
22510 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
22520 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49  pOn);.  sqlite3I
22530 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
22540 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  pUsing);.  sqlit
22550 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
22560 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20  b, pSubquery);. 
22570 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22580 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
22590 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
225a0 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
225b0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
225c0 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
225d0 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
225e0 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
225f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
22600 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
22610 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
22620 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
22630 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
22640 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
22650 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  y){.  assert( pI
22660 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20  ndexedBy!=0 );. 
22670 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78   if( p && pIndex
22680 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  edBy->n>0 ){.   
22690 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
226a0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
226b0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63   assert( p->nSrc
226c0 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20  >0 );.    pItem 
226d0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
226e0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
226f0 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
22700 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
22710 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
22720 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
22730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22740 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
22750 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nc==0 );.    if(
22760 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
22770 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
22780 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
22790 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
227a0 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
227b0 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
227c0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
227d0 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
227e0 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
227f0 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
22800 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  fg.notIndexed = 
22810 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22820 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49      pItem->u1.zI
22830 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
22840 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
22850 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
22860 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70  exedBy);.      p
22870 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
22880 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  edBy = 1;.    }.
22890 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
228a0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e   the list of fun
228b0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
228c0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65  to the SrcList e
228d0 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61  ntry for a.** ta
228e0 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74  ble-valued-funct
228f0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
22900 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41  ite3SrcListFuncA
22910 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  rgs(Parse *pPars
22920 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45  e, SrcList *p, E
22930 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
22940 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
22950 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22960 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
22970 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
22980 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
22990 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d  ->fg.notIndexed=
229a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
229b0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  ( pItem->fg.isIn
229c0 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20  dexedBy==0 );.  
229d0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
229e0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  >fg.isTabFunc==0
229f0 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   );.    pItem->u
22a00 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69  1.pFuncArg = pLi
22a10 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66  st;.    pItem->f
22a20 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b  g.isTabFunc = 1;
22a30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
22a40 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
22a50 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
22a60 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pList);.  }.}../
22a70 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
22a80 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
22a90 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
22aa0 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
22ab0 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
22ac0 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
22ad0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
22ae0 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
22af0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
22b00 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
22b10 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
22b20 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
22b30 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
22b40 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
22b50 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
22b60 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
22b70 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
22b80 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
22b90 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
22ba0 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
22bb0 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
22bc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
22bd0 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
22be0 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
22bf0 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
22c00 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
22c10 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
22c20 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
22c30 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
22c40 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
22c50 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
22c60 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
22c70 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
22c80 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
22c90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
22ca0 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
22cb0 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
22cc0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
22cd0 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
22ce0 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
22cf0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
22d00 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
22d10 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
22d20 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
22d30 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  i].fg.jointype =
22d40 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f   p->a[i-1].fg.jo
22d50 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
22d60 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69    p->a[0].fg.joi
22d70 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ntype = 0;.  }.}
22d80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
22d90 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61   VDBE code for a
22da0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
22db0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22dc0 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
22dd0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
22de0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
22df0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
22e00 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
22e10 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22e20 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
22e30 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
22e40 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
22e50 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
22e60 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
22e70 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
22e80 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29  "BEGIN", 0, 0) )
22e90 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
22ea0 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
22eb0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
22ec0 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72    if( !v ) retur
22ed0 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54  n;.  if( type!=T
22ee0 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20  K_DEFERRED ){.  
22ef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
22f00 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
22f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22f20 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61  Op2(v, OP_Transa
22f30 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d  ction, i, (type=
22f40 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31  =TK_EXCLUSIVE)+1
22f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22f60 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
22f70 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   i);.    }.  }. 
22f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
22f90 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p0(v, OP_AutoCom
22fa0 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  mit);.}../*.** G
22fb0 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
22fc0 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f  e for a COMMIT o
22fd0 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65  r ROLLBACK state
22fe0 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f  ment..** Code fo
22ff0 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65  r ROLLBACK is ge
23000 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65  nerated if eType
23010 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20  ==TK_ROLLBACK.  
23020 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64  Otherwise.** cod
23030 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
23040 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a  or a COMMIT..*/.
23050 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
23060 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65  ransaction(Parse
23070 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54   *pParse, int eT
23080 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ype){.  Vdbe *v;
23090 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63  .  int isRollbac
230a0 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  k;..  assert( pP
230b0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
230c0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
230d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
230e0 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54  eType==TK_COMMIT
230f0 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e   || eType==TK_EN
23100 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  D || eType==TK_R
23110 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52  OLLBACK );.  isR
23120 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d  ollback = eType=
23130 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  =TK_ROLLBACK;.  
23140 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
23150 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
23160 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
23170 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62   .       isRollb
23180 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22  ack ? "ROLLBACK"
23190 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20   : "COMMIT", 0, 
231a0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
231b0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
231c0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
231d0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
231e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
231f0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
23200 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c  ommit, 1, isRoll
23210 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  back);.  }.}../*
23220 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23230 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
23240 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
23250 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
23260 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
23270 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
23280 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
23290 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
232a0 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
232b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
232c0 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
232d0 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
232e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
232f0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
23300 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
23310 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
23320 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
23330 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
23340 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
23350 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
23360 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
23370 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
23380 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
23390 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
233a0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
233b0 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
233c0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
233d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
233e0 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
233f0 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
23400 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
23410 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
23420 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
23430 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
23440 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
23450 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
23460 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
23470 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
23480 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
23490 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
234a0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
234b0 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
234c0 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
234d0 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
234e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
234f0 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
23500 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
23510 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
23520 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
23530 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
23540 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
23550 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
23560 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
23570 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23580 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
23590 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
235a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
235b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
235c0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
235d0 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
235e0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
235f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
23600 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
23610 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
23620 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
23630 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23640 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
23650 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
23660 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
23670 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
23680 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
23690 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
236a0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
236b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
236c0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
236d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
236e0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
236f0 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
23700 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
23710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23720 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
23730 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23740 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
23750 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
23760 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
23770 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
23780 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
23790 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
237a0 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
237b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
237c0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
237d0 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
237e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
237f0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
23800 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
23810 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
23820 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
23830 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
23840 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
23850 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
23860 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
23870 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
23880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
238a0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
238b0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
238c0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
238d0 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
238e0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
238f0 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
23900 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
23910 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
23920 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
23930 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
23940 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
23950 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
23960 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
23970 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
23980 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
23990 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
239a0 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
239b0 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
239c0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
239d0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
239e0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
239f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  );..  assert( iD
23a00 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72  b>=0 && iDb<pPar
23a10 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  se->db->nDb );. 
23a20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
23a30 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42  >db->aDb[iDb].pB
23a40 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
23a50 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
23a60 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
23a70 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
23a80 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
23a90 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65  MutexHeld(pParse
23aa0 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  ->db, iDb, 0) );
23ab0 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73  .  if( DbMaskTes
23ac0 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
23ad0 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
23ae0 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
23af0 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
23b00 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  kieMask, iDb);. 
23b10 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
23b20 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
23b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
23b40 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70  enTempDatabase(p
23b50 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  Toplevel);.    }
23b60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
23b70 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73   argument zDb is
23b80 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c   NULL, then call
23b90 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23ba0 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65  fySchema() for e
23bb0 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64  ach .** attached
23bc0 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72   database. Other
23bd0 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20  wise, invoke it 
23be0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
23bf0 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e   named zDb only.
23c00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23c10 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
23c20 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
23c30 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
23c40 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  *zDb){.  sqlite3
23c50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23c60 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  b;.  int i;.  fo
23c70 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
23c80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
23c90 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
23ca0 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
23cb0 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20  pBt && (!zDb || 
23cc0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
23cd0 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53  p(zDb, pDb->zDbS
23ce0 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20  Name)) ){.      
23cf0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
23d00 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
23d10 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
23d20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
23d30 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70  VDBE code that p
23d40 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e  repares for doin
23d50 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74  g an operation t
23d60 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61  hat.** might cha
23d70 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nge the database
23d80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23d90 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65  tine starts a ne
23da0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  w transaction if
23db0 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65   we are not alre
23dc0 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  ady within.** a 
23dd0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
23de0 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
23df0 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63  within a transac
23e00 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65  tion, then a che
23e10 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65  ckpoint.** is se
23e20 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74  t if the setStat
23e30 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ement parameter 
23e40 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63  is true.  A chec
23e50 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a  kpoint should.**
23e60 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72   be set for oper
23e70 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68  ations that migh
23e80 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61  t fail (due to a
23e90 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72   constraint) par
23ea0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20  t of.** the way 
23eb0 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63  through and whic
23ec0 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75  h will need to u
23ed0 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20  ndo some writes 
23ee0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
23ef0 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68  o.** rollback th
23f00 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74  e whole transact
23f10 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74  ion.  For operat
23f20 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63  ions where all c
23f30 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61  onstraints.** ca
23f40 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66  n be checked bef
23f50 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ore any changes 
23f60 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
23f70 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20  database, it is 
23f80 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61  never.** necessa
23f90 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69  ry to undo a wri
23fa0 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  te and the check
23fb0 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74  point should not
23fc0 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   be set..*/.void
23fd0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
23fe0 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73  teOperation(Pars
23ff0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73  e *pParse, int s
24000 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74  etStatement, int
24010 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a   iDb){.  Parse *
24020 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
24030 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
24040 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
24050 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
24060 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
24070 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54  ;.  DbMaskSet(pT
24080 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
24090 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70  sk, iDb);.  pTop
240a0 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
240b0 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
240c0 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
240d0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
240e0 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
240f0 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
24100 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
24110 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
24120 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
24130 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
24140 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
24150 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
24160 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
24170 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
24180 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
24190 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
241a0 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
241b0 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
241c0 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
241d0 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
241e0 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
241f0 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
24200 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
24210 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
24220 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
24230 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
24240 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
24250 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
24260 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
24270 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
24280 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
24290 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
242a0 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
242b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
242c0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
242d0 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
242e0 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
242f0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
24300 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
24310 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
24320 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
24330 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
24340 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
24350 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
24360 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
24370 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
24380 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
24390 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
243a0 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
243b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
243c0 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
243d0 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
243e0 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
243f0 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
24400 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
24410 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
24420 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
24430 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
24440 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
24450 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
24460 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
24470 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
24480 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
24490 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
244a0 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
244b0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
244c0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
244d0 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
244e0 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
244f0 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
24500 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
24510 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
24520 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
24530 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
24540 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
24550 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
24560 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
24570 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
24580 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
24590 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
245a0 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
245b0 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
245c0 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
245d0 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
245e0 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
245f0 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
24600 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
24610 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
24620 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
24630 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
24640 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
24650 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
24660 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
24670 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
24680 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
24690 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
246a0 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
246b0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
246c0 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
246d0 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
246e0 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
246f0 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
24700 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
24710 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
24720 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
24730 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
24740 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24750 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
24760 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
24770 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
24780 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
24790 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
247a0 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
247b0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
247c0 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
247d0 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
247e0 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
247f0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
24800 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
24810 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
24820 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
24830 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
24840 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
24850 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
24860 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
24870 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
24880 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
24890 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
248a0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
248b0 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
248c0 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
248d0 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
248e0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
248f0 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
24900 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
24910 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
24920 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
24930 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c  , p4type);.  sql
24940 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
24950 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d  (v, p5Errmsg);.}
24960 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
24970 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55  OP_Halt due to U
24980 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
24990 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
249a0 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  violation..*/.vo
249b0 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65  id sqlite3Unique
249c0 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
249d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
249e0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
249f0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
24a00 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
24a10 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a  straint type */.
24a20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
24a30 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
24a40 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74   that triggers t
24a50 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  he constraint */
24a60 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
24a70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72  ;.  int j;.  Str
24a80 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20  Accum errMsg;.  
24a90 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
24aa0 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73  dx->pTable;..  s
24ab0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
24ac0 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72  it(&errMsg, pPar
24ad0 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 0a 20  se->db, 0, 0, . 
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24af0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
24b00 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
24b10 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 29 3b 0a 20  IMIT_LENGTH]);. 
24b20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45   if( pIdx->aColE
24b30 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xpr ){.    sqlit
24b40 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26  e3_str_appendf(&
24b50 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20 27  errMsg, "index '
24b60 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  %q'", pIdx->zNam
24b70 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
24b80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
24b90 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
24ba0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
24bb0 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
24bc0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
24bd0 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 7a  j]>=0 );.      z
24be0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
24bf0 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
24c00 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  j]].zName;.     
24c10 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33   if( j ) sqlite3
24c20 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72  _str_append(&err
24c30 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20  Msg, ", ", 2);. 
24c40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
24c50 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d  _appendall(&errM
24c60 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  sg, pTab->zName)
24c70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24c80 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72 4d  str_append(&errM
24c90 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  sg, ".", 1);.   
24ca0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
24cb0 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73 67  ppendall(&errMsg
24cc0 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , zCol);.    }. 
24cd0 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69   }.  zErr = sqli
24ce0 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
24cf0 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71  h(&errMsg);.  sq
24d00 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
24d10 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20  int(pParse, .   
24d20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
24d30 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54  ex(pIdx) ? SQLIT
24d40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
24d50 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20  MARYKEY .       
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f       : SQLITE_CO
24d80 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c  NSTRAINT_UNIQUE,
24d90 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45  .    onError, zE
24da0 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20  rr, P4_DYNAMIC, 
24db0 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
24dc0 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  que);.}.../*.** 
24dd0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
24de0 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75  due to non-uniqu
24df0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64  e rowid..*/.void
24e00 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e   sqlite3RowidCon
24e10 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
24e20 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
24e30 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
24e40 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
24e50 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69  ,      /* Confli
24e60 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
24e70 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62  gorithm */.  Tab
24e80 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f  le *pTab       /
24e90 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68  * The table with
24ea0 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20   the non-unique 
24eb0 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63  rowid */ .){.  c
24ec0 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74  har *zMsg;.  int
24ed0 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d   rc;.  if( pTab-
24ee0 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20  >iPKey>=0 ){.   
24ef0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
24f00 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
24f10 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
24f20 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f40 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54     pTab->aCol[pT
24f50 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65  ab->iPKey].zName
24f60 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
24f70 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
24f80 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73  IMARYKEY;.  }els
24f90 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  e{.    zMsg = sq
24fa0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
24fb0 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77  rse->db, "%s.row
24fc0 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  id", pTab->zName
24fd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
24fe0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
24ff0 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  WID;.  }.  sqlit
25000 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
25010 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45  (pParse, rc, onE
25020 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  rror, zMsg, P4_D
25030 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20  YNAMIC,.        
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69  P5_ConstraintUni
25060 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  que);.}../*.** C
25070 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70  heck to see if p
25080 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63  Index uses the c
25090 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
250a0 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e  e pColl.  Return
250b0 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64  .** true if it d
250c0 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66  oes and false if
250d0 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f   it does not..*/
250e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
250f0 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
25100 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f  tic int collatio
25110 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
25120 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20  r *zColl, Index 
25130 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20  *pIndex){.  int 
25140 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f  i;.  assert( zCo
25150 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ll!=0 );.  for(i
25160 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
25170 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
25180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
25190 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
251a0 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
251b0 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  z!=0 || pIndex->
251c0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b  aiColumn[i]<0 );
251d0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
251e0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20  >aiColumn[i]>=0 
251f0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
25200 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29  ICmp(z, zColl) )
25210 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
25220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25230 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
25240 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
25250 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
25260 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74   pTab that use t
25270 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
25280 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20  uence pColl..** 
25290 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
252a0 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   recompute all i
252b0 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a  ndices of pTab..
252c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
252d0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
252e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
252f0 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  exTable(Parse *p
25300 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
25310 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ab, char const *
25320 7a 43 6f 6c 6c 29 7b 0a 20 20 69 66 28 20 21 49  zColl){.  if( !I
25330 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
25340 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e  {.    Index *pIn
25350 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
25360 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
25370 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
25380 61 62 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 70  ab */..    for(p
25390 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64  Index=pTab->pInd
253a0 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64  ex; pIndex; pInd
253b0 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74  ex=pIndex->pNext
253c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  ){.      if( zCo
253d0 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69  ll==0 || collati
253e0 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70  onMatch(zColl, p
253f0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
25400 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
25410 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
25420 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
25430 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
25440 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
25450 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
25460 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
25470 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25480 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
25490 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
254a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
254b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
254c0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
254d0 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20   indices of all 
254e0 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61  tables in all da
254f0 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68  tabases where th
25500 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65  e.** indices use
25510 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
25520 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
25530 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e  If pColl==0 then
25540 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c   recompute.** al
25550 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77  l indices everyw
25560 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  here..*/.#ifndef
25570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
25580 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
25590 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
255a0 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
255b0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
255c0 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20  ll){.  Db *pDb; 
255d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255e0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64     /* A single d
255f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
25600 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
25610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25620 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
25630 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
25640 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
25650 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
25660 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
25670 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20  n */.  HashElem 
25680 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *k;             
25690 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
256a0 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e  g over tables in
256b0 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20   pDb */.  Table 
256c0 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
256d0 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65        /* A table
256e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
256f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
25700 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
25710 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
25720 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72  ;  /* Needed for
25730 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a   schema access *
25740 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70  /.  for(iDb=0, p
25750 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c  Db=db->aDb; iDb<
25760 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20  db->nDb; iDb++, 
25770 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  pDb++){.    asse
25780 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20  rt( pDb!=0 );.  
25790 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
257a0 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
257b0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
257c0 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
257d0 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
257e0 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
257f0 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
25800 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  );.      reindex
25810 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
25820 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  ab, zColl);.    
25830 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
25840 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
25850 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e  ode for the REIN
25860 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
25870 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
25880 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X               
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
258a0 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  1.**        REIN
258b0 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e  DEX  <collation>
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
258d0 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 2.**        RE
258e0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
258f0 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20  e>.?<tablename> 
25900 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20   -- 3.**        
25910 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
25920 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65  ase>.?<indexname
25930 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f  >  -- 4.**.** Fo
25940 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20  rm 1 causes all 
25950 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61  indices in all a
25960 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
25970 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e  s to be rebuilt.
25980 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69  .** Form 2 rebui
25990 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  lds all indices 
259a0 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
259b0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61   that use the na
259c0 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67  med.** collating
259d0 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d   function.  Form
259e0 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c  s 3 and 4 rebuil
259f0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
25a00 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69  x or all.** indi
25a10 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ces associated w
25a20 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61  ith the named ta
25a30 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
25a40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
25a50 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  DEX.void sqlite3
25a60 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70  Reindex(Parse *p
25a70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
25a80 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  ame1, Token *pNa
25a90 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  me2){.  CollSeq 
25aa0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
25ab0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
25ac0 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
25ad0 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55  reindexed, or NU
25ae0 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  LL */.  char *z;
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61      /* Name of a
25b10 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
25b20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25b30 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
25b40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
25b50 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61  database */.  Ta
25b60 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
25b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
25b80 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
25b90 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20  base */.  Index 
25ba0 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
25bb0 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
25bc0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
25bd0 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20  h pTab */.  int 
25be0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
25bf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
25c00 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
25c10 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
25c20 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
25c30 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
25c40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
25c50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62   */.  Token *pOb
25c60 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  jName;          
25c70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25c80 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
25c90 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20  to be reindexed 
25ca0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
25cb0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
25cc0 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
25cd0 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
25ce0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
25cf0 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
25d00 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
25d10 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
25d20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
25d30 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
25d40 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
25d50 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
25d60 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Name1==0 ){.    
25d70 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
25d80 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20  (pParse, 0);.   
25d90 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
25da0 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65   if( NEVER(pName
25db0 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d  2==0) || pName2-
25dc0 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  >z==0 ){.    cha
25dd0 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73  r *zColl;.    as
25de0 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20  sert( pName1->z 
25df0 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73  );.    zColl = s
25e00 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
25e10 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
25e20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
25e30 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
25e40 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
25e50 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
25e60 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43  (db, ENC(db), zC
25e70 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  oll, 0);.    if(
25e80 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
25e90 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
25ea0 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
25eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
25ec0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
25ed0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
25ee0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25ef0 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
25f00 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
25f10 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
25f20 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
25f30 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e  , pName2, &pObjN
25f40 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
25f50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
25f60 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
25f70 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e  mToken(db, pObjN
25f80 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
25f90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62   ) return;.  zDb
25fa0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
25fb0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 54 61 62  zDbSName;.  pTab
25fc0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
25fd0 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
25fe0 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
25ff0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
26000 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
26010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
26020 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
26030 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
26040 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
26050 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
26060 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
26070 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
26080 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
26090 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
260a0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
260b0 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
260c0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
260d0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
260e0 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
260f0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
26100 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26110 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
26120 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
26130 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
26140 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
26150 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65  *.** Return a Ke
26160 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
26170 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
26180 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
26190 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  n Index..**.** T
261a0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
261b0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
261c0 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
261d0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
261e0 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
261f0 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
26200 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
26210 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
26220 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
26230 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
26240 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Idx){.  int i;. 
26250 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
26260 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74  ->nColumn;.  int
26270 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b   nKey = pIdx->nK
26280 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66 6f  eyCol;.  KeyInfo
26290 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70 50   *pKey;.  if( pP
262a0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
262b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49 64  urn 0;.  if( pId
262c0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29  x->uniqNotNull )
262d0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
262e0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
262f0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65  (pParse->db, nKe
26300 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20  y, nCol-nKey);. 
26310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
26320 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
26330 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
26340 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 7d  b, nCol, 0);.  }
26350 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
26360 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26370 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
26380 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
26390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
263a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
263b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
263c0 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b   = pIdx->azColl[
263d0 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  i];.      pKey->
263e0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c  aColl[i] = zColl
263f0 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  ==sqlite3StrBINA
26400 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20  RY ? 0 :.       
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
26430 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
26440 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  oll);.      pKey
26450 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
26460 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
26470 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  er[i];.    }.   
26480 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
26490 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
264a0 74 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  t( pParse->rc==S
264b0 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d 49 53 53  QLITE_ERROR_MISS
264c0 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29 3b 0a 20  ING_COLLSEQ );. 
264d0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
264e0 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b 0a 20 20  NoQuery==0 ){.  
264f0 20 20 20 20 20 20 2f 2a 20 44 65 61 63 74 69 76        /* Deactiv
26500 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 62 65  ate the index be
26510 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61 69 6e  cause it contain
26520 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6c  s an unknown col
26530 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  lating.        *
26540 2a 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68 65  * sequence.  The
26550 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 72 65 61   only way to rea
26560 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20  ctive the index 
26570 69 73 20 74 6f 20 72 65 6c 6f 61 64 20 74 68 65  is to reload the
26580 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 63 68 65  .        ** sche
26590 6d 61 2e 20 20 41 64 64 69 6e 67 20 74 68 65 20  ma.  Adding the 
265a0 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6e  missing collatin
265b0 67 20 73 65 71 75 65 6e 63 65 20 6c 61 74 65 72  g sequence later
265c0 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20   does not.      
265d0 20 20 2a 2a 20 72 65 61 63 74 69 76 65 20 74 68    ** reactive th
265e0 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 61 70  e index.  The ap
265f0 70 6c 69 63 61 74 69 6f 6e 20 68 61 64 20 74 68  plication had th
26600 65 20 63 68 61 6e 63 65 20 74 6f 20 72 65 67 69  e chance to regi
26610 73 74 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ster.        ** 
26620 74 68 65 20 6d 69 73 73 69 6e 67 20 69 6e 64 65  the missing inde
26630 78 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  x using the coll
26640 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20 63 61 6c  ation-needed cal
26650 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20 20 20 20  lback.  For.    
26660 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 63 69 74      ** simplicit
26670 79 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  y, SQLite will n
26680 6f 74 20 67 69 76 65 20 74 68 65 20 61 70 70 6c  ot give the appl
26690 69 63 61 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  ication a second
266a0 20 63 68 61 6e 63 65 2e 0a 20 20 20 20 20 20 20   chance..       
266b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78   */.        pIdx
266c0 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20 31 3b 0a  ->bNoQuery = 1;.
266d0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
266e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
266f0 52 5f 52 45 54 52 59 3b 0a 20 20 20 20 20 20 7d  R_RETRY;.      }
26700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65  .      sqlite3Ke
26710 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
26720 3b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30  ;.      pKey = 0
26730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26740 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69  turn pKey;.}..#i
26750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26760 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  T_CTE./* .** Thi
26770 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
26780 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54  oked once per CT
26790 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  E by the parser 
267a0 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20  while parsing a 
267b0 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e  .** WITH clause.
267c0 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74   .*/.With *sqlit
267d0 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61 72  e3WithAdd(.  Par
267e0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
267f0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
26800 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74  context */.  Wit
26810 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
26820 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67       /* Existing
26830 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72   WITH clause, or
26840 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
26850 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *pName,        
26860 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
26870 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a  e common-table *
26880 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
26890 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f  rglist,     /* O
268a0 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e  ptional column n
268b0 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65  ame list for the
268c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
268d0 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20 20  ct *pQuery      
268e0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65      /* Query use
268f0 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  d to initialize 
26900 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
26910 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26920 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69  pParse->db;.  Wi
26930 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72  th *pNew;.  char
26940 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43   *zName;..  /* C
26950 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43 54  heck that the CT
26960 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  E name is unique
26970 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49 54   within this WIT
26980 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a  H clause. If.  *
26990 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20  * not, store an 
269a0 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
269b0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  se structure. */
269c0 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
269d0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
269e0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
269f0 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
26a00 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20  && pWith ){.    
26a10 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
26a20 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74  =0; i<pWith->nCt
26a30 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
26a40 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
26a50 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e  p(zName, pWith->
26a60 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  a[i].zName)==0 )
26a70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26a80 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
26a90 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49 54  , "duplicate WIT
26aa0 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73  H table name: %s
26ab0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
26ac0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
26ad0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
26ae0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
26af0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
26b00 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
26b10 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
26b20 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
26b30 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
26b40 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
26b50 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
26b60 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
26b70 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
26b80 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
26b90 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
26ba0 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
26bb0 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
26bc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26bd0 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
26be0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
26bf0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26c00 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
26c10 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
26c20 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
26c30 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
26c40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
26c50 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
26c60 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
26c70 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
26c80 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
26c90 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
26ca0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
26cb0 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
26cc0 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
26cd0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
26ce0 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
26cf0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
26d00 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
26d10 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
26d20 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
26d30 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
26d40 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
26d50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
26d60 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
26d70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
26d80 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
26d90 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
26da0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
26db0 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
26dc0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
26dd0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
26de0 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
26df0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
26e00 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
26e10 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
26e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
26e30 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
26e40 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
26e50 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
26e60 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
26e70 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
26e80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
26e90 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
26ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
26eb0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
26ec0 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
26ed0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
26ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
26ef0 20 2a 2f 0a                                       */.