/ Hex Artifact Content
Login

Artifact cb86906fcc9150514024d74befa6905bce2323f51518cc5973e4be6a5b00fd16:


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 72 65 74 75 72 6e 3b 20 20  ){.    return;  
2120: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
2130: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
2140: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2150: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2160: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2170: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2180: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2190: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
21a0: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
21b0: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
21c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2200: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2220: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2230: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2240: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2250: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2260: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2270: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2280: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2290: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22a0: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
22b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
22c0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
22d0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
22e0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
22f0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
2300: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
2310: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2320: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2330: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2350: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2360: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2370: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2380: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2390: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
23a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
23b0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
23c0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
23d0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
23e0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
23f0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2400: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2410: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2420: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2430: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2440: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2450: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2460: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2470: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2480: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2490: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
24a0: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
24b0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
24c0: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
24d0: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
24e0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
24f0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2500: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2510: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2520: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2530: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2540: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2550: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2560: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2570: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2580: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2590: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
25a0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
25b0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
25c0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
25d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
25e0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
25f0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
2600: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
2610: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2620: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2630: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2640: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2660: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2670: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2680: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2690: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
26a0: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
26b0: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
26c0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
26d0: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
26e0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
26f0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
2700: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
2710: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2720: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2750: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2760: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2770: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2780: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2790: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
27a0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
27b0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
27c0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
27d0: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
27e0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
27f0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
2800: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
2810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2820: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
2830: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
2840: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71  ;.        p = sq
2850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2860: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2870: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
2880: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2890: 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20  p ) return p;.  
28a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28b0: 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49  /* Not found.  I
28c0: 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65  f the name we we
28d0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77  re looking for w
28e0: 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d  as temp.sqlite_m
28f0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  aster.    ** the
2900: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d  n change the nam
2910: 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70  e to sqlite_temp
2920: 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20  _master and try 
2930: 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
2940: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2950: 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  (zName, MASTER_N
2960: 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  AME)!=0 ) break;
2970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2980: 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61  _stricmp(zDataba
2990: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  se, db->aDb[1].z
29a0: 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72  DbSName)!=0 ) br
29b0: 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  eak;.    zName =
29c0: 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d   TEMP_MASTER_NAM
29d0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
29e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  0;.}../*.** Loca
29f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a10: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a20: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a30: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a50: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a60: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2a70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2a80: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2a90: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2aa0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ab0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2ac0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2ad0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2ae0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2af0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b00: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b10: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b20: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b30: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b40: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b50: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b60: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2b70: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2b80: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2b90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2ba0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2bb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2bd0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2be0: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2bf0: 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20  .  u32 flags,   
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43            /* LOC
2c10: 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41  ATE_VIEW or LOCA
2c20: 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f  TE_NOERR */.  co
2c30: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2c40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c50: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2c60: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c80: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
2c90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ca0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
2cb0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
2cc0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2cd0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2ce0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2cf0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2d00: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d10: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2d20: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2d30: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2d40: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2d50: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  L. */.  if( (db-
2d60: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
2d70: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
2d80: 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49  )==0 .   && SQLI
2d90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2da0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2db0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2dc0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2de0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2df0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2e00: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2e10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e20: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
2e30: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
2e40: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
2e50: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
2e60: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
2e70: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
2e80: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
2e90: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
2ea0: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
2eb0: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
2ec0: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2ed0: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2ee0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
2ef0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74  Parse->disableVt
2f00: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ab==0 ){.      M
2f10: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
2f20: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
2f30: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
2f40: 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ule, zName);.   
2f50: 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26     if( pMod==0 &
2f60: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
2f70: 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
2f80: 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  a_", 7)==0 ){.  
2f90: 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c        pMod = sql
2fa0: 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65  ite3PragmaVtabRe
2fb0: 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65  gister(db, zName
2fc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2fd0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
2fe0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
2ff0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
3000: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
3010: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3020: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3030: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3040: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c     if( flags & L
3050: 4f 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65  OCATE_NOERR ) re
3060: 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72  turn 0;.    pPar
3070: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
3080: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
3090: 20 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26   IsVirtual(p) &&
30a0: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
30b0: 56 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20  Vtab ){.    p = 
30c0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d  0;.  }..  if( p=
30d0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
30e0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61  char *zMsg = fla
30f0: 67 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57  gs & LOCATE_VIEW
3100: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
3110: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
3120: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
3130: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
3140: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3150: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
3160: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
3170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
3180: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3190: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
31a0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
31b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
31c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
31d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
31e0: 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
31f0: 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a  fied by *p..**.*
3200: 2a 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70  * This is a wrap
3210: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
3220: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
3230: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
3240: 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74  between.** sqlit
3250: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20  e3LocateTable() 
3260: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
3270: 6e 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  n is that this f
3280: 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74  unction restrict
3290: 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20  s.** the search 
32a0: 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53  to schema (p->pS
32b0: 63 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20  chema) if it is 
32c0: 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63  not NULL. p->pSc
32d0: 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e  hema may be.** n
32e0: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  on-NULL if it is
32f0: 20 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20   part of a view 
3300: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
3310: 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53  am definition. S
3320: 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78  ee.** sqlite3Fix
3330: 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65  SrcList() for de
3340: 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20  tails..*/.Table 
3350: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
3360: 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65  bleItem(.  Parse
3370: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32   *pParse, .  u32
3380: 20 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74   flags,.  struct
3390: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
33b0: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
33c0: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
33d0: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
33e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
33f0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
3400: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
3410: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
3420: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
3430: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
3440: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
3450: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
3460: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
3470: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20   p->zDatabase;. 
3480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3490: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
34a0: 50 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d  Parse, flags, p-
34b0: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a  >zName, zDb);.}.
34c0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
34d0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
34e0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
34f0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
3500: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
3510: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3520: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
3530: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3540: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
3550: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3560: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3570: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
3580: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
3590: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
35a0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
35b0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
35c0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
35d0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
35e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
35f0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
3600: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
3610: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
3620: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
3630: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
3640: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
3650: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
3660: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
3670: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
3680: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
3690: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
36a0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
36b0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
36c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
36d0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
36e0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
36f0: 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c   int i;.  /* All
3700: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
3710: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
3720: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
3730: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
3740: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
3750: 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Db!=0 || sqlite3
3760: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
3770: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f  exes(db) );.  fo
3780: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
3790: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
37a0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
37b0: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
37c0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
37d0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
37e0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
37f0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  a = db->aDb[j].p
3800: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
3810: 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20  rt( pSchema );. 
3820: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
3830: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
3840: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
3850: 53 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  SName) ) continu
3860: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
3870: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3880: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
3890: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
38a0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
38b0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
38c0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
38d0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
38e0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
38f0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
3900: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
3910: 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71  index.*/.void sq
3920: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73  lite3FreeIndex(s
3930: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
3940: 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
3950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
3960: 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  ZE.  sqlite3Dele
3970: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
3980: 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, p);.#endif.  
3990: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
39a0: 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64  e(db, p->pPartId
39b0: 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  xWhere);.  sqlit
39c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
39d0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72  (db, p->aColExpr
39e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
39f0: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3a00: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3a10: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3a20: 44 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64  DbFree(db, (void
3a30: 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23   *)p->azColl);.#
3a40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3a50: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3a60: 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  T4.  sqlite3_fre
3a70: 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a  e(p->aiRowEst);.
3a80: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3a90: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3aa0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3ab0: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
3ac0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
3ad0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
3ae0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
3af0: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
3b00: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
3b10: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
3b20: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
3b30: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
3b40: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
3b50: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3b60: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
3b70: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3b90: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3ba0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3bb0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3bc0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3bd0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3be0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
3bf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c00: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3c10: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3c20: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
3c30: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
3c40: 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64  >idxHash;.  pInd
3c50: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
3c60: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
3c70: 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66  dxName, 0);.  if
3c80: 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29  ( ALWAYS(pIndex)
3c90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
3ca0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3cb0: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
3cc0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
3cd0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
3ce0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
3d00: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20  ex *p;.      /* 
3d10: 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66  Justification of
3d20: 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20   ALWAYS();  The 
3d30: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e  index must be on
3d40: 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20   the list of.   
3d50: 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a     ** indices. *
3d60: 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64  /.      p = pInd
3d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3d80: 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
3d90: 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d   ALWAYS(p) && p-
3da0: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29  >pNext!=pIndex )
3db0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
3dc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
3dd0: 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  YS(p && p->pNext
3de0: 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  ==pIndex) ){.   
3df0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
3e00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3e10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3e20: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
3e30: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e40: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e50: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e60: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e70: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e80: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3ea0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3eb0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3ec0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ed0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ee0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ef0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3f00: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f10: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f20: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f30: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f40: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f50: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f60: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f70: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f80: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f90: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3fa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fb0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fc0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fd0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fe0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3ff0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4000: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4010: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4020: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4030: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4040: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4050: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4060: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4070: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4080: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4090: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
40a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40c0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40d0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40e0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40f0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
4100: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4110: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4120: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4130: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4140: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4150: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4160: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4170: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4180: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4190: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
41a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41b0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41c0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41d0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41e0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41f0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
4200: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4210: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4220: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4230: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4240: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4250: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4260: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4270: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4280: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4290: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
42a0: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42b0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42d0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42e0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42f0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
4300: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4310: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4320: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4330: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
4340: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
4350: 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b   ~DBFLAG_SchemaK
4360: 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69  nownOk;.  }..  i
4370: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4380: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ck==0 ){.    for
4390: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
43a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
43b0: 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
43c0: 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61  b, i, DB_ResetWa
43d0: 6e 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  nted) ){.       
43e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
43f0: 65 61 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ear(db->aDb[i].p
4400: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d  Schema);.      }
4410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4420: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
4430: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
4440: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
4450: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
4460: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
4470: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
4480: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
4490: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
44a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
44b0: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
44c0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
44d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
44e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
44f0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
4500: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
4510: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
4520: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4530: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4540: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
4550: 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65     if( db->nSche
4560: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4570: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4580: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
4590: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  hema);.      }el
45a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65  se{.        DbSe
45b0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  tProperty(db, i,
45c0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
45d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
45e0: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
45f0: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
4600: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
4610: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
4630: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4640: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4650: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66  aveAll(db);.  if
4660: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4670: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  k==0 ){.    sqli
4680: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4690: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
46a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
46b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46c0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
46d0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
46e0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
46f0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
4700: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
4710: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4720: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
4730: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  e;.}../*.** Dele
4740: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
4750: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
4760: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
4770: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
4780: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
4790: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64   array)..*/.void
47a0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
47b0: 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65  lumnNames(sqlite
47c0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
47d0: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
47e0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
47f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4800: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
4810: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
4820: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
4830: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
4840: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
4850: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4860: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4870: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4880: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4890: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
48a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
48b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
48c0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
48d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
48e0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
48f0: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4900: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4910: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4920: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4930: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4940: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4950: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4960: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
4970: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
4980: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
4990: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
49a0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
49b0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
49c0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
49d0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
49e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
49f0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4a00: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4a10: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4a20: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4a30: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4a40: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4a50: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4a60: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
4a70: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
4a80: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
4a90: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
4aa0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
4ab0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
4ac0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4ad0: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4ae0: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4af0: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4b00: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4b10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4b20: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4b30: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4b40: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4b50: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4b60: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
4b70: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
4b80: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
4b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
4ba0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c  ITE_NOINLINE del
4bb0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4bc0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4bd0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4be0: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a  Index, *pNext;..
4bf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4c00: 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  BUG.  /* Record 
4c10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
4c20: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73  tstanding lookas
4c30: 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ide allocations 
4c40: 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  in schema Tables
4c50: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64  .  ** prior to d
4c60: 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20  oing any free() 
4c70: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e  operations.  Sin
4c80: 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  ce schema Tables
4c90: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a   do not use.  **
4ca0: 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73   lookaside, this
4cb0: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e   number should n
4cc0: 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20  ot change. */.  
4cd0: 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  int nLookaside =
4ce0: 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20   0;.  if( db && 
4cf0: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4d00: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4d10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f  )==0 ){.    nLoo
4d20: 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33  kaside = sqlite3
4d30: 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62  LookasideUsed(db
4d40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
4d50: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4d60: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4d70: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4d80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4d90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4da0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4db0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4dc0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4dd0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4de0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4df0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4e00: 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20  Schema.         
4e10: 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54  || (IsVirtual(pT
4e20: 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d  able) && pIndex-
4e30: 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
4e40: 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29  _IDXTYPE_APPDEF)
4e50: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d   );.    if( (db=
4e60: 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  =0 || db->pnByte
4e70: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49  sFreed==0) && !I
4e80: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
4e90: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
4ea0: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
4eb0: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
4ec0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
4ed0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4ee0: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4ef0: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4f00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4f10: 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29  zName, 0.      )
4f20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4f30: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
4f40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4f50: 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
4f60: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
4f70: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4f80: 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30  Index || pOld==0
4f90: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4fa0: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64  lite3FreeIndex(d
4fb0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4fc0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4fd0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4fe0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4ff0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
5000: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
5010: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
5020: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
5030: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
5040: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
5050: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
5060: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
5070: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5080: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
5090: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
50a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
50b0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
50c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
50d0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
50e0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
50f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5100: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5110: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5120: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5130: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5140: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5150: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5160: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5170: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5180: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5190: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
51a0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
51b0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
51c0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
51d0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
51e0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
51f0: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5200: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5210: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5220: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5230: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5240: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5250: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
5260: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
5270: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
5280: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
5290: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
52a0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
52b0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
52c0: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
52d0: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
52e0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
52f0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5300: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5310: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5320: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5330: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5340: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5350: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5360: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5370: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5380: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5390: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
53a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
53b0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
53c0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
53d0: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
53e0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
53f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5400: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5410: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5420: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5440: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5450: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5460: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5470: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5480: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5490: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
54a0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
54b0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
54c0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
54d0: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
54e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
54f0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5500: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5510: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5520: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5530: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5550: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
5560: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5570: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5580: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5590: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
55a0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
55b0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
55c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
55d0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
55e0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
55f0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5600: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5610: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5620: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5630: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5640: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5650: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
5660: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5670: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5680: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5690: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
56a0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
56b0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
56c0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
56d0: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
56e0: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
56f0: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5700: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5710: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5720: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5730: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5740: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5750: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
5760: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5770: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5780: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5790: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
57a0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
57b0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
57c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
57d0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
57e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
57f0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5810: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5820: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5830: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5840: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5850: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
5860: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5870: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5880: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5890: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
58a0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
58b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
58c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
58d0: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
58e0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
58f0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5900: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5910: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5920: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5930: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5940: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5950: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5960: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5970: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5990: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
59a0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
59b0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
59c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
59d0: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
59e0: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
59f0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5a00: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5a10: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5a20: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5a30: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5a40: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5a50: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5a60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5a70: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5a80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a90: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5aa0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5ab0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5ac0: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5ad0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5ae0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5af0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5b00: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5b10: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5b20: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5b30: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5b40: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5b50: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5b60: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5b70: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5b80: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5b90: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ba0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5bb0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5bc0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5bd0: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5be0: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5bf0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5c00: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5c10: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5c20: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5c30: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5c40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5c70: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5c80: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5c90: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5ca0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5cb0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5cc0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5cd0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5ce0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5cf0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5d00: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5d10: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5d20: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5d30: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5d40: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5d50: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5d60: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5d70: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5da0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5db0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5dc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5de0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5df0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5e00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5e10: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5e20: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5e30: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5e40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5e60: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5e70: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5e80: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5e90: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5ea0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5eb0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5ec0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5ed0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5ee0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5ef0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5f00: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5f10: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5f20: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5f30: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5f40: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5f50: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5f60: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5f70: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5f80: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5f90: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5fa0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5fb0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5fc0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5fd0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5fe0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5ff0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
6000: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
6010: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
6020: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6030: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
6040: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
6050: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
6060: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
6070: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
6080: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
6090: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
60a0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
60b0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
60c0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
60d0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
60e0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
60f0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6100: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6110: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6120: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6130: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6140: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6150: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
6160: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
6170: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6180: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
6190: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
61a0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
61b0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
61c0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
61d0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
61f0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6200: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6210: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6220: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6230: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6240: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6250: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
6260: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
6270: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6280: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
6290: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
62a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
62b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
62c0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
62d0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
62e0: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
62f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6300: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6310: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6320: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6330: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6340: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6350: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6360: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6370: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
6380: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
6390: 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  || IN_RENAME_OBJ
63a0: 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  ECT.            
63b0: 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67   || (db->mDbFlag
63c0: 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75  s & DBFLAG_Vacuu
63d0: 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20  m)!=0);.    iDb 
63e0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
63f0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6400: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6410: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6420: 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41  * True if PRAGMA
6430: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
6440: 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71   is ON.*/.int sq
6450: 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68  lite3WritableSch
6460: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ema(sqlite3 *db)
6470: 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  {.  testcase( (d
6480: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6490: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
64a0: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
64b0: 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
64c0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  ( (db->flags&(SQ
64d0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
64e0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
64f0: 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  e))==.          
6500: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74       SQLITE_Writ
6510: 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73  eSchema );.  tes
6520: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6530: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6540: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6550: 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20  ensive))==.     
6560: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6570: 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20  _Defensive );.  
6580: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
6590: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
65a0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
65b0: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
65d0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
65e0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
65f0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  e) );.  return (
6600: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6610: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6620: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6630: 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  ==SQLITE_WriteSc
6640: 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hema;.}../*.** T
6650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6660: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6670: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6680: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
6690: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
66a0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
66b0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
66c0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
66d0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
66e0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
66f0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
6700: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
6710: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6720: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6730: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6740: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6750: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6760: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6770: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6780: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
6790: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
67a0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
67b0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
67c0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
67d0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
67e0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
67f0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
6800: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
6810: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6820: 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  a(pParse->db)==0
6830: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
6840: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6850: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6860: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6880: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6890: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
68a0: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
68b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
68c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
68d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
68e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
68f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
6900: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
6910: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
6920: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
6930: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
6940: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6950: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6960: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6970: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6980: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6990: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
69a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
69b0: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
69c0: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
69d0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
69e0: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
69f0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
6a00: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
6a10: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
6a20: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
6a30: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
6a40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6a50: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6a60: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6a70: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6a80: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6a90: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6aa0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6ab0: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6ac0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6ad0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6ae0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
6af0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
6b00: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
6b10: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
6b20: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
6b30: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
6b40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6b50: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6b60: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6b70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6b80: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6b90: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6ba0: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6bb0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6bc0: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6bd0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6be0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
6bf0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
6c00: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
6c10: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
6c20: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
6c30: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
6c40: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6c50: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6c60: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6c70: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6c80: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6c90: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6ca0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6cb0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6cc0: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6cd0: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6ce0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
6cf0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
6d00: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6d10: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6d20: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6d30: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6d40: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6d50: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6d60: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6d70: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6d80: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6d90: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6da0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6db0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6dc0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6dd0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6de0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6df0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
6e00: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
6e10: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6e20: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6e30: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6e40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6e50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6e60: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6e70: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6e80: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6e90: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6ea0: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6eb0: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6ec0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6ed0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6ee0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6ef0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6f00: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
6f10: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6f20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6f30: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6f40: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6f50: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6f60: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6f70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6f80: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6f90: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6fa0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6fb0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6fc0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6fd0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6fe0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6ff0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
7000: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7010: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
7020: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
7030: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7040: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
7050: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
7060: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
7070: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
7080: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
7090: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
70a0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
70b0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
70c0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
70d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
70e0: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
70f0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
7100: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
7110: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
7120: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
7130: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
7140: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7150: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
7160: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
7170: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
7180: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
7190: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
71a0: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
71b0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
71c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
71d0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
71e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
71f0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
7200: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
7210: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
7220: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
7230: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
7240: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
7250: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
7260: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
7270: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
7280: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
7290: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
72a0: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
72b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
72c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
72d0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
72e0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
72f0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
7300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7310: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
7320: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
7330: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
7340: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
7350: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7360: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
7370: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
7380: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
7390: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
73a0: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
73b0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
73c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
73d0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
73e0: 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e  *pName;.  if( zN
73f0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
7400: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
7410: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
7420: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
7430: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
7440: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7450: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
7460: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
7470: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
7480: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7490: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
74a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d  .  assert( isTem
74b0: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
74c0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
74d0: 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
74e0: 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20  ew==1 );.  {.   
74f0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7500: 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   aCode[] = {.   
7510: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7520: 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  E_TABLE,.       
7530: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7540: 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  MP_TABLE,.      
7550: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
7560: 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  IEW,.       SQLI
7570: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7580: 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  IEW.    };.    c
7590: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
75a0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
75b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
75c0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
75d0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
75e0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
75f0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
7600: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
7610: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7620: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
7630: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
7640: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
7650: 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65  arse, (int)aCode
7660: 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77  [isTemp+2*isView
7670: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
76a0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
76b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
76c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
76d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
76e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
76f0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
7700: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
7710: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
7720: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
7730: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
7740: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
7750: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
7760: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
7770: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
7780: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
7790: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
77a0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
77b0: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
77c0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
77d0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
77e0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
77f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
7800: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
7810: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
7820: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
7830: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
7840: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
7850: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
7860: 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
7870: 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  E ){.    char *z
7880: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7890: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
78a0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
78b0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
78c0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
78d0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
78e0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
78f0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
7900: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
7910: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
7920: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
7930: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
7940: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
7950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7960: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
7970: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
7980: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
7990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
79a0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
79b0: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
79c0: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
79d0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
79e0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
79f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7a00: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7a10: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7a20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
7a30: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
7a40: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7a50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7a60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7a70: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
7a80: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
7a90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
7aa0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7ab0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7ac0: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
7ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7ae0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
7af0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
7b00: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
7b10: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
7b20: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
7b30: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7b40: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
7b50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7b60: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
7b70: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
7b80: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
7b90: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
7ba0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
7bb0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
7bc0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
7bd0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7be0: 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  le->nTabRef = 1;
7bf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7c00: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20  EFAULT_ROWEST.  
7c10: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7c20: 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
7c30: 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  st(SQLITE_DEFAUL
7c40: 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65  T_ROWEST);.#else
7c50: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7c60: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7c70: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7c80: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
7c90: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
7ca0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
7cb0: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7cc0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7cd0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7ce0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7cf0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7d00: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7d10: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7d20: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7d30: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7d40: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7d50: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7d60: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
7d70: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
7d80: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
7d90: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
7da0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7db0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7dc0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7dd0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7de0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7df0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7e10: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7e20: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7e30: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7e40: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7e50: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
7e60: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
7e70: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
7e80: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
7e90: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
7ea0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
7eb0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7ec0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7ed0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7ee0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7ef0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7f00: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7f10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7f20: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
7f30: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
7f40: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
7f50: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
7f60: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
7f70: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
7f80: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
7f90: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
7fa0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
7fb0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
7fc0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
7fd0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7fe0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7ff0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
8000: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
8010: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
8020: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
8030: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
8040: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8050: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
8060: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
8070: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
8080: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
8090: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
80a0: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
80b0: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
80c0: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
80d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
80e0: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
80f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
8100: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
8110: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
8120: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
8130: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8140: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
8150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8160: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8170: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
8180: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
8190: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
81a0: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
81b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
81c0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
81d0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
81e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
81f0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
8200: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
8210: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
8220: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
8230: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
8240: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8250: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
8260: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
8270: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8280: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
8290: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
82a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
82b0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
82c0: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
82d0: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
82e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
82f0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
8300: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
8310: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8320: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
8330: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8340: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
8350: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8360: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
8370: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
8380: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
8390: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
83a0: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
83b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
83c0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
83d0: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
83e0: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
83f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8410: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8420: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
8430: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
8440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
8450: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
8460: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
8470: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
8480: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
8490: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
84a0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
84b0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
84c0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
84d0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
84e0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
84f0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
8500: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
8510: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
8520: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
8530: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
8540: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
8550: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
8560: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
8570: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
8580: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
8590: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
85a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
85b0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
85c0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
85d0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
85e0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
85f0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
8600: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
8610: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
8620: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
8630: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
8640: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8660: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8670: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8680: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8690: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
86a0: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
86b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
86c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
86d0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
86e0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
86f0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
8700: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
8710: 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71  ab =.         sq
8720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8730: 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
8740: 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54  e, iDb, reg2, BT
8750: 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20  REE_INTKEY);.   
8760: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
8770: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
8780: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87a0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
87b0: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
87c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87d0: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
87e0: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
87f0: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
8800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8810: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
8820: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
8830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8840: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8850: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
8860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8870: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
8880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
8890: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
88a0: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
88b0: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
88c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
88d0: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
88e0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
88f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8900: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
8910: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
8920: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
8930: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
8940: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
8950: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
8960: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
8970: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8980: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
8990: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
89a0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
89b0: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
89c0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
89d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
89e0: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
89f0: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
8a00: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
8a10: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8a20: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
8a30: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
8a40: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
8a50: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
8a60: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
8a70: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
8a80: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
8a90: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
8aa0: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
8ab0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8ac0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8ad0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8ae0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8af0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8b00: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8b10: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
8b20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
8b30: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
8b40: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8b50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8b60: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8b70: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8b80: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8b90: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8bb0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8bc0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8bd0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8be0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8bf0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8c00: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
8c10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8c20: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8c30: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
8c40: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8c50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8c60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8c70: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8c80: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8c90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
8ca0: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8cb0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8cc0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8cd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ce0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8cf0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8d00: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8d10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
8d20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8d30: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8d40: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
8d50: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8d60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f  eturn;.  if( IN_
8d70: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20  RENAME_OBJECT ) 
8d80: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
8d90: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
8da0: 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a  oid*)z, pName);.
8db0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8dc0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8dd0: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8de0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8df0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8e00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8e10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8e20: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8e30: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8e40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8e50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8e60: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8e70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8e80: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8e90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8ea0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8eb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8ec0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8ee0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8ef0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8f00: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8f10: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8f20: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8f30: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8f40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f50: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8f60: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8f70: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8f80: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8f90: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8fa0: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8fb0: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8fc0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8fd0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8ff0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
9000: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
9010: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
9020: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
9030: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
9040: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
9050: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
9060: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
9070: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
9080: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
9090: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
90a0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
90b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
90c0: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
90d0: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
90e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
90f0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
9100: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
9110: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9120: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9130: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9140: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9150: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9160: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9170: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
9180: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9190: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
91a0: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
91b0: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
91c0: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
91d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
91e0: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
91f0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
9200: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
9210: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
9220: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
9230: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
9240: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
9250: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
9260: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
9270: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
9280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9290: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
92a0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
92b0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
92c0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
92d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
92e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
92f0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
9300: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
9310: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
9320: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9330: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9340: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9350: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9360: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9370: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9380: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
93a0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
93b0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
93c0: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
93d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
93e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
93f0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9400: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9410: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9420: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9430: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9440: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9450: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9460: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9470: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9480: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9490: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
94a0: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
94b0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
94c0: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
94d0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
94e0: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
94f0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9500: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
9510: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9520: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9530: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9540: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9550: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9560: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9580: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9590: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
95a0: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
95b0: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
95c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
95d0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
95e0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
95f0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
9600: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
9610: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
9620: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9630: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9640: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
9650: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
9660: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9670: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9680: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9690: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
96a0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
96b0: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
96c0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
96d0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
96e0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
96f0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
9700: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
9710: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
9720: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9730: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
9740: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
9750: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
9760: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9770: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9780: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
97a0: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
97b0: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
97f0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
9800: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
9810: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9820: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9830: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9840: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9850: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
9860: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9870: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9880: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9890: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
98a0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
98b0: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
98c0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
98d0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
98e0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
98f0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
9900: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
9910: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
9920: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9930: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
9940: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9950: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9960: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9970: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9980: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9990: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
99a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
99b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
99c0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
99d0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
99e0: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
99f0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9a00: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9a10: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9a20: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9a30: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9a40: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9a50: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9a60: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9a70: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9a80: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9a90: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9aa0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9ab0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9ad0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9ae0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9af0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9b00: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9b10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9b20: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9b30: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9b40: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9b50: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9b60: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9b70: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9b80: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9b90: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9ba0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9bb0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9bc0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9bd0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9be0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9bf0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9c00: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9c10: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9c20: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9c30: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9c40: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9c50: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9c60: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9c70: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9c80: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9c90: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9ca0: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9cb0: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9cc0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9cd0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9ce0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9cf0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9d00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9d10: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9d20: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9d30: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9d40: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9d50: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9d60: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9d70: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9d80: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9d90: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9da0: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9db0: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9dd0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9de0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9df0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9e00: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9e10: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9e20: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9e30: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9e40: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9e50: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9e60: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9e70: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9e80: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9ea0: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9eb0: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9ec0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9ed0: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9ee0: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9ef0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9f00: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9f10: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9f20: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9f30: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9f40: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9f50: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9f60: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9f70: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9f80: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9f90: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9fa0: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9fb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9fc0: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9fd0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9ff0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
a000: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
a010: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
a020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
a030: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
a040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
a050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a060: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
a070: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
a080: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a090: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
a0a0: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
a0b0: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
a0c0: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
a0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
a0e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a0f0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
a100: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
a110: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a120: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
a130: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
a140: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a150: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
a160: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
a170: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
a180: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
a190: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
a1a0: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
a1b0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
a1c0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
a1d0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
a1e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
a1f0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a200: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
a210: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
a220: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a230: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
a240: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
a250: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
a260: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
a270: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
a280: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
a290: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
a2a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a2b0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
a2c0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
a2d0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
a2e0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
a2f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a300: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a310: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
a320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a330: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a340: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a350: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a370: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a380: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a390: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a3b0: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a3c0: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a3d0: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a3e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a3f0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a400: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a410: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a420: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a430: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a440: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a460: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a470: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a480: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a490: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a4a0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a4b0: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a4c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a4d0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a4e0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a4f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a510: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a520: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a530: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a540: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a560: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a570: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a580: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a590: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a5a0: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a5b0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a5c0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a5d0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a5e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a5f0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a600: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a610: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a620: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a630: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a640: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a650: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a660: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a670: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a680: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a690: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a6a0: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a6b0: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a6c0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a6d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a6e0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a6f0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a700: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a710: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a720: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49     }.  }.  if( I
a730: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
a740: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
a750: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
a760: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
a770: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
a780: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
a790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
a7a0: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
a7b0: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
a7c0: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
a7d0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
a7e0: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
a7f0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
a800: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
a810: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
a820: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
a830: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
a840: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
a850: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
a860: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
a870: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
a880: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
a890: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
a8a0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
a8b0: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
a8c0: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
a8d0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
a8e0: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
a8f0: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
a900: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
a910: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
a920: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
a930: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
a940: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a950: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
a960: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
a970: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
a980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
a990: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
a9a0: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
a9b0: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
a9c0: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
a9d0: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
a9e0: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
a9f0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
aa00: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
aa10: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
aa20: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
aa30: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
aa40: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
aa50: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
aa60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
aa70: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
aa80: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
aa90: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
aaa0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
aab0: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
aac0: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
aad0: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
aae0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
aaf0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
ab00: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
ab10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ab20: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
ab30: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
ab40: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
ab50: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
ab60: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
ab70: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
ab80: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
ab90: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
aba0: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
abb0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
abc0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
abd0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
abe0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
abf0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
ac00: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
ac10: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
ac20: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
ac30: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
ac40: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
ac50: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
ac60: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
ac70: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
ac80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
ac90: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
aca0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
acb0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
acc0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
acd0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
ace0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
acf0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
ad00: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
ad10: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
ad20: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
ad30: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
ad40: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
ad50: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
ad60: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
ad70: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
ad80: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
ad90: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
ada0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
adb0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
adc0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
add0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ade0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
adf0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
ae00: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
ae10: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
ae20: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
ae30: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
ae40: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
ae50: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
ae60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
ae70: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ae80: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ae90: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
aea0: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
aeb0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
aec0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
aed0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
aee0: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
aef0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
af00: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
af10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
af20: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
af30: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
af40: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
af50: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
af60: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
af70: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
af80: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
af90: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
afa0: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
afb0: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
afc0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
afd0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
afe0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
aff0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
b000: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
b010: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
b020: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
b030: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b040: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
b050: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
b060: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
b070: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
b080: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
b090: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
b0a0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
b0b0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
b0c0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
b0d0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
b0e0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
b0f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
b100: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
b110: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
b120: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
b130: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
b140: 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  KEY;.    nTerm =
b150: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
b160: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
b170: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
b180: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
b190: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b1a0: 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
b1b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
b1c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b1d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b1e0: 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20   pCExpr!=0 );.  
b1f0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
b200: 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20  gToId(pCExpr);. 
b210: 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d       if( pCExpr-
b220: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
b230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b240: 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70   *zCName = pCExp
b250: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
b260: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
b270: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b280: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
b290: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b2a0: 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20  StrICmp(zCName, 
b2b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b2c0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
b2d0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
b2e0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
b2f0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l];.            
b300: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b310: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b320: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  Y;.            b
b330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b340: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b350: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b360: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
b370: 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71  && pCol.   && sq
b380: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c  lite3StrICmp(sql
b390: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
b3a0: 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45  Col,""), "INTEGE
b3b0: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
b3c0: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
b3d0: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
b3e0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
b3f0: 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  JECT && pList ){
b400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b410: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
b420: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
b430: 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Key, pList->a[0]
b440: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
b450: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
b460: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
b470: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
b480: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
b490: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
b4a0: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
b4b0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
b4c0: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
b4d0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
b4e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
b4f0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
b500: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
b510: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
b520: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
b530: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
b540: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b550: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
b560: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b570: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
b580: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
b590: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
b5a0: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
b5b0: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
b5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b5d0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
b5e0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
b5f0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
b600: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b620: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
b630: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
b640: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
b650: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
b660: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b670: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
b680: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b690: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
b6a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b6b0: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
b6c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
b6d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
b6e0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
b6f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
b700: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
b710: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
b720: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b730: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b740: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
b750: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
b760: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
b770: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b780: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b790: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b7a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b7b0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b7c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b7d0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
b7e0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
b7f0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b800: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b810: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b820: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b830: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b840: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b850: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b860: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b870: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b880: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b890: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b8a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b8b0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b8c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b8d0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b8e0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b8f0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b900: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b910: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
b920: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
b930: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b940: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
b950: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
b960: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b970: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
b980: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
b990: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
b9a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b9b0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
b9c0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
b9d0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
b9e0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
b9f0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ba10: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
ba20: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ba30: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
ba40: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
ba50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ba60: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
ba70: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
ba80: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
ba90: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
baa0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
bab0: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
bac0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
bad0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
bae0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
baf0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
bb00: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
bb10: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
bb20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
bb30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
bb40: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
bb50: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
bb60: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
bb70: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
bb80: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
bb90: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
bba0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
bbb0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
bbc0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
bbd0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
bbe0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
bbf0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
bc00: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
bc10: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
bc20: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
bc30: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
bc40: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
bc50: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
bc60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
bc70: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
bc80: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
bc90: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
bca0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
bcb0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
bcc0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
bcd0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
bce0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bcf0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bd00: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
bd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bd20: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
bd30: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
bd40: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
bd50: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
bd60: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
bd70: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
bd80: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
bd90: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
bda0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
bdb0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bdc0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
bdd0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
bde0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
bdf0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
be00: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
be10: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
be20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
be30: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
be40: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
be50: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
be60: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
be70: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
be80: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
be90: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
bea0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
beb0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
bec0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
bed0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
bee0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
bef0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
bf00: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
bf10: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
bf20: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
bf30: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
bf40: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
bf50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bf60: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
bf70: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
bf80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
bf90: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
bfa0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bfb0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
bfc0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
bfd0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bfe0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
bff0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
c000: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
c010: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
c020: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
c030: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
c040: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c050: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
c060: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
c070: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
c080: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
c090: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c0a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
c0b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c0c0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
c0d0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
c0e0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
c0f0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
c100: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
c110: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
c120: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
c130: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
c140: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
c150: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
c160: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
c170: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
c180: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
c190: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
c1a0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
c1b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
c1c0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
c1d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
c1e0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
c1f0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
c200: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
c210: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
c220: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c230: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
c240: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
c250: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
c260: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
c270: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
c280: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
c290: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
c2a0: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
c2b0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
c2c0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
c2d0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
c2e0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
c2f0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
c300: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
c310: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
c320: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
c330: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
c340: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
c350: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
c360: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
c370: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
c380: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
c390: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
c3a0: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
c3b0: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
c3c0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
c3d0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
c3e0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
c3f0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
c400: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
c410: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
c420: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
c430: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
c440: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
c450: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
c460: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
c470: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
c480: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
c490: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  ough..**.** IMPL
c4a0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
c4b0: 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c  -34230-56049 SQL
c4c0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
c4d0: 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20  y increments.** 
c4e0: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
c4f0: 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  on whenever the 
c500: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
c510: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c520: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
c530: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c540: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
c550: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c560: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c570: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
c580: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c590: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c5a0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
c5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c5c0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
c5d0: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
c5e0: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20  MA_VERSION, .   
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65  (int)(1+(unsigne
c610: 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  d)db->aDb[iDb].p
c620: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
c630: 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ookie));.}../*.*
c640: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
c650: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
c660: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
c670: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
c680: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
c690: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
c6a0: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
c6b0: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
c6c0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
c6d0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
c6e0: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
c6f0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
c700: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
c710: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
c720: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
c730: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
c740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
c750: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
c760: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
c770: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
c780: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
c790: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
c7a0: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
c7b0: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
c7c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
c7d0: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c7e0: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
c7f0: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
c800: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
c810: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c820: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
c830: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
c840: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
c850: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
c860: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c870: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
c880: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
c890: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
c8a0: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
c8b0: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
c8c0: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
c8d0: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
c8e0: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
c8f0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
c900: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
c910: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
c920: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
c930: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
c940: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
c950: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
c960: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
c970: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
c980: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
c990: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
c9a0: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
c9b0: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
c9c0: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
c9d0: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
c9e0: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
c9f0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
ca00: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
ca10: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
ca20: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
ca30: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
ca40: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
ca50: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
ca60: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
ca70: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
ca80: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
ca90: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
caa0: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
cab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
cac0: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
cad0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
cae0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
caf0: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
cb00: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
cb10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
cb20: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
cb30: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
cb40: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
cb50: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
cb60: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
cb70: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
cb80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
cb90: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
cba0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
cbb0: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
cbc0: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
cbd0: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
cbe0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
cbf0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
cc00: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
cc10: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
cc20: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
cc30: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
cc40: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
cc50: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
cc60: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
cc70: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
cc80: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
cc90: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
cca0: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
ccb0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ccc0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
ccd0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
cce0: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
ccf0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
cd00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
cd10: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
cd20: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
cd30: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
cd40: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
cd50: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
cd60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
cd70: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
cd80: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
cd90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
cda0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
cdb0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
cdc0: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
cdd0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
cde0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
cdf0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
ce00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
ce10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
ce20: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
ce30: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
ce40: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
ce50: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
ce60: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
ce70: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
ce80: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
ce90: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
cea0: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
ceb0: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
cec0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
ced0: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
cee0: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
cef0: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
cf00: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
cf10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
cf20: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
cf30: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
cf40: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
cf50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
cf60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
cf70: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
cf80: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
cf90: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
cfa0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
cfb0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
cfc0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
cfd0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
cfe0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
cff0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
d000: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
d010: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
d020: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
d030: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
d040: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
d050: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
d060: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
d070: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
d080: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
d090: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d0a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
d0b0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
d0c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d0d0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
d0e0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
d0f0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
d100: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
d110: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
d120: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d130: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
d140: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
d150: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
d160: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
d170: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
d180: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
d190: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
d1a0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
d1b0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
d1c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
d1d0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
d1e0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
d1f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d200: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
d210: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d220: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
d230: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
d240: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
d250: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d260: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
d270: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d280: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d290: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
d2a0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d2b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d2c0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
d2d0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d2e0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d2f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
d300: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d310: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d320: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
d330: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
d340: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
d350: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
d360: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
d370: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
d380: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
d390: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
d3a0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3b0: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
d3c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
d3d0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
d3e0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
d3f0: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
d400: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
d410: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
d420: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
d430: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
d440: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
d450: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
d460: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
d470: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
d480: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
d490: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
d4a0: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
d4b0: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
d4c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
d4d0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
d4e0: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
d4f0: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
d500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d510: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d520: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
d530: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
d540: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
d550: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
d560: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
d570: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
d580: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
d590: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
d5a0: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
d5b0: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
d5c0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
d5d0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
d5e0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
d5f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d600: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
d610: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d620: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
d630: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
d640: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
d650: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
d660: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d670: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
d680: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74  onst char**)zExt
d690: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
d6a0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b  sizeof(char*)*N;
d6b0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d6c0: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
d6d0: 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49  , sizeof(i16)*pI
d6e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d6f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
d700: 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20   (i16*)zExtra;. 
d710: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
d720: 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63  f(i16)*N;.  memc
d730: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d740: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64  >aSortOrder, pId
d750: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d760: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
d770: 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20  = (u8*)zExtra;. 
d780: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d790: 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65   N;.  pIdx->isRe
d7a0: 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74  sized = 1;.  ret
d7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d7c0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d7d0: 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77   the total row w
d7e0: 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65  idth for a table
d7f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d800: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
d810: 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dth(Table *pTab)
d820: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61  {.  unsigned wTa
d830: 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ble = 0;.  const
d840: 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
d850: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
d860: 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  (i=pTab->nCol, p
d870: 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
d880: 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61  l; i>0; i--, pTa
d890: 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61  bCol++){.    wTa
d8a0: 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e  ble += pTabCol->
d8b0: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  szEst;.  }.  if(
d8c0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29   pTab->iPKey<0 )
d8d0: 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61   wTable++;.  pTa
d8e0: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
d8f0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62  lite3LogEst(wTab
d900: 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le*4);.}../*.** 
d910: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
d920: 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72  rage size of a r
d930: 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  ow for an index.
d940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d950: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
d960: 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  th(Index *pIdx){
d970: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64  .  unsigned wInd
d980: 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ex = 0;.  int i;
d990: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
d9a0: 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54  *aCol = pIdx->pT
d9b0: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f  able->aCol;.  fo
d9c0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
d9d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d9e0: 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e    i16 x = pIdx->
d9f0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
da00: 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d   assert( x<pIdx-
da10: 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b  >pTable->nCol );
da20: 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78  .    wIndex += x
da30: 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49  <0 ? 1 : aCol[pI
da40: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
da50: 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49  .szEst;.  }.  pI
da60: 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  dx->szIdxRow = s
da70: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e  qlite3LogEst(wIn
da80: 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  dex*4);.}../* Re
da90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c  turn true if val
daa0: 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e  ue x is found an
dab0: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
dac0: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
dad0: 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63  iCol[].*/.static
dae0: 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63   int hasColumn(c
daf0: 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c  onst i16 *aiCol,
db00: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78   int nCol, int x
db10: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c  ){.  while( nCol
db20: 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d  -- > 0 ) if( x==
db30: 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74  *(aiCol++) ) ret
db40: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
db50: 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75  0;.}../* Recompu
db60: 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78  te the colNotIdx
db70: 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ed field of the 
db80: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c  Index..**.** col
db90: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69  NotIdxed is a bi
dba0: 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61  tmask that has a
dbb0: 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74   0 bit represent
dbc0: 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64  ing each indexed
dbd0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
dbe0: 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
dbf0: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
dc00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
dc10: 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65  The.** high-orde
dc20: 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49  r bit of colNotI
dc30: 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31  dxed is always 1
dc40: 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64  .  All unindexed
dc50: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
dc60: 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20  he table have a 
dc70: 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  1..**.** The col
dc80: 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73  NotIdxed mask is
dc90: 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65   AND-ed with the
dca0: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c   SrcList.a[].col
dcb0: 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20  Used mask.** to 
dcc0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
dcd0: 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69   index is coveri
dce0: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ng index..*/.sta
dcf0: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75  tic void recompu
dd00: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
dd10: 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29  xed(Index *pIdx)
dd20: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
dd30: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
dd40: 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
dd50: 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
dd60: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
dd70: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
dd80: 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
dd90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dda0: 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
ddb0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
ddc0: 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
ddd0: 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
dde0: 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
ddf0: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63   }.  }.  pIdx->c
de00: 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b  olNotIdxed = ~m;
de10: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
de20: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36  ->colNotIdxed>>6
de30: 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3)==1 );.}../*.*
de40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
de50: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
de60: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
de70: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
de80: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
de90: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
dea0: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
deb0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dec0: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
ded0: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
dee0: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
def0: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
df00: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
df10: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
df20: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
df30: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
df40: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
df50: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
df60: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
df70: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
df80: 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c      (1)  Set all
df90: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
dfa0: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
dfb0: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
dfc0: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
dfd0: 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33   (2)  Convert P3
dfe0: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
dff0: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
e000: 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b   from BTREE_INTK
e010: 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EY .**          
e020: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
e030: 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  EY..**     (3)  
e040: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e050: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
e060: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
e070: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
e080: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
e090: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
e0a0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
e0b0: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
e0c0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
e0d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e0e0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
e0f0: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
e100: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
e110: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
e120: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e130: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
e140: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
e150: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
e160: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
e170: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
e180: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
e190: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e1a0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e1b0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e1c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
e1d0: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
e1e0: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
e1f0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
e200: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
e210: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
e220: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
e230: 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72  nAllField and ar
e240: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
e250: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
e260: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
e270: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
e280: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
e290: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
e2a0: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
e2b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
e2c0: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
e2d0: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
e2e0: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
e2f0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   KEY columns..**
e300: 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20  .** For virtual 
e310: 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29  tables, only (1)
e320: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
e330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e340: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e350: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
e360: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e370: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
e380: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
e390: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
e3a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
e3b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e3c0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
e3d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e3e0: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
e3f0: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
e400: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
e410: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
e420: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
e430: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
e440: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e450: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e460: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
e480: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
e490: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
e4a0: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
e4b0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
e4c0: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
e4d0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
e4e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
e4f0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
e500: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
e510: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
e520: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
e530: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
e540: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
e550: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
e560: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
e570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
e580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e590: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
e5a0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
e5b0: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
e5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
e5d0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e5e0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
e5f0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
e600: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
e610: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
e620: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
e630: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
e640: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
e650: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
e660: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
e670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
e680: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
e690: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
e6a0: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
e6b0: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
e6c0: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
e6d0: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
e6e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
e6f0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
e700: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e710: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
e720: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
e730: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
e740: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e750: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e760: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
e770: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
e780: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
e790: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
e7a0: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
e7b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
e7c0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
e7d0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
e7e0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
e7f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
e820: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
e830: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
e840: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
e850: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
e860: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
e870: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e880: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
e890: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
e8a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e8b0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
e8c0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
e8d0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
e8e0: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
e8f0: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
e900: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
e910: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
e920: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
e930: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
e940: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
e950: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
e960: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
e970: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
e980: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
e990: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
e9a0: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
e9b0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
e9c0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
e9d0: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
e9e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e9f0: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
ea00: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
ea10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
ea20: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
ea30: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
ea40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ea50: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
ea60: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
ea70: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
ea80: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
ea90: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
eaa0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
eab0: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
eac0: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
ead0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
eae0: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
eaf0: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
eb00: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
eb10: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73  Col;..  /* Bypas
eb20: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
eb30: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
eb40: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
eb50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
eb60: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
eb70: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
eb80: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
eb90: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
eba0: 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72  BE.  ** code for
ebb0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ebc0: 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e  (not when parsin
ebd0: 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66  g one as part of
ebe0: 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20   reading.  ** a 
ebf0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
ec00: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
ec10: 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a   pPk->tnum>0 ){.
ec20: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
ec30: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
ec40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ec50: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
ec60: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
ec70: 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  o);.  }..  /* Th
ec80: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
ec90: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
eca0: 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  s the table root
ecb0: 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e   page */.  pPk->
ecc0: 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  tnum = pTab->tnu
ecd0: 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  m;..  /* Update 
ece0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
ecf0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ed00: 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63  all UNIQUE indic
ed10: 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  es by converting
ed20: 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
ed30: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  rowid column int
ed40: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  o one or more co
ed50: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
ed60: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20  MARY KEY..  */. 
ed70: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
ed80: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
ed90: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
eda0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
edb0: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
edc0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
edd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ede0: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
edf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ee00: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ee10: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ee20: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ee30: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ee50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
ee60: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
ee70: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
ee80: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
ee90: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
eea0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
eeb0: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
eec0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
eed0: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
eee0: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
eef0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
ef00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
ef10: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
ef20: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
ef30: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ef40: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ef50: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ef60: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ef70: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
ef80: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
ef90: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
efa0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
efb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
efc0: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
efd0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
efe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f000: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
f010: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
f020: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f030: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
f040: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
f050: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
f060: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f070: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
f080: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
f090: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
f0a0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
f0b0: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
f0c0: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
f0d0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
f0e0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
f0f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
f100: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
f110: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
f120: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f130: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
f140: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
f150: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
f160: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
f170: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74  zColl[j] = sqlit
f180: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
f190: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
f1a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
f1b0: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
f1c0: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
f1d0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
f1e0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
f1f0: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
f200: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
f210: 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
f220: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b  nsNotIndexed(pPk
f230: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
f240: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f250: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74  LTABLE./*.** Ret
f260: 75 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d  urn true if zNam
f270: 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61  e is a shadow ta
f280: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
f290: 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
f2a0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
f2b0: 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74  **.** zName is t
f2c0: 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66  emporarily modif
f2d0: 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72  ied while this r
f2e0: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e  outine is runnin
f2f0: 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73  g, but is.** res
f300: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f310: 67 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f  ginal value prio
f320: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
f330: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
f340: 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61  static int isSha
f350: 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c  dowTableName(sql
f360: 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a  ite3 *db, char *
f370: 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  zName){.  char *
f380: 7a 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20  zTail;          
f390: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f3a0: 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22  er to the last "
f3b0: 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  _" in zName */. 
f3c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3e0: 2a 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61  * Table that zNa
f3f0: 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f  me is a shadow o
f400: 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70  f */.  Module *p
f410: 4d 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mod;            
f420: 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66       /* Module f
f430: 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
f440: 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c  able */..  zTail
f450: 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65   = strrchr(zName
f460: 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54  , '_');.  if( zT
f470: 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ail==0 ) return 
f480: 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  0;.  *zTail = 0;
f490: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
f4a0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
f4b0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61  Name, 0);.  *zTa
f4c0: 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20  il = '_';.  if( 
f4d0: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
f4e0: 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72   0;.  if( !IsVir
f4f0: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
f500: 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20  urn 0;.  pMod = 
f510: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
f520: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
f530: 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d  odule, pTab->azM
f540: 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20  oduleArg[0]);.  
f550: 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65  if( pMod==0 ) re
f560: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d  turn 0;.  if( pM
f570: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65  od->pModule->iVe
f580: 72 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e  rsion<3 ) return
f590: 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
f5a0: 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77  pModule->xShadow
f5b0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
f5c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f   0;.  return pMo
f5d0: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61  d->pModule->xSha
f5e0: 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29  dowName(zTail+1)
f5f0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
f600: 6e 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65  ne isShadowTable
f610: 4e 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64  Name(x,y) 0.#end
f620: 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
f630: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f640: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
f650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f660: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
f670: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
f680: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
f690: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
f6a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
f6b0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
f6c0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
f6d0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
f6e0: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
f6f0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
f700: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
f710: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
f720: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
f730: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
f740: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
f750: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
f760: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
f770: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
f780: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
f790: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
f7a0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
f7b0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
f7c0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
f7d0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
f7e0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
f7f0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f800: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
f810: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
f820: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
f830: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
f840: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f850: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
f860: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
f870: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
f880: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
f890: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
f8a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f8b0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
f8c0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
f8d0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
f8e0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
f8f0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
f900: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
f910: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
f920: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
f930: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
f940: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
f950: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
f960: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
f970: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
f980: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
f990: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
f9a0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
f9b0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
f9c0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
f9d0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
f9e0: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
f9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fa00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
fa10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
fa20: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
fa30: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
fa40: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
fa50: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
fa60: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
fa70: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
fa80: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
fa90: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
faa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
fab0: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
fac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
fad0: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
fae0: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
faf0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
fb00: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
fb10: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
fb20: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
fb30: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
fb40: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
fb50: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
fb60: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
fb70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fb80: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
fb90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
fba0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbc0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
fbd0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
fbe0: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
fbf0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
fc00: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
fc10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
fc20: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e  le */..  if( pEn
fc30: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
fc40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
fc50: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fc60: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
fc70: 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  d );.  p = pPars
fc80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
fc90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
fca0: 6e 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  n;..  if( pSelec
fcb0: 74 3d 3d 30 20 26 26 20 69 73 53 68 61 64 6f 77  t==0 && isShadow
fcc0: 54 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d  TableName(db, p-
fcd0: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 70  >zName) ){.    p
fce0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
fcf0: 5f 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20  _Shadow;.  }..  
fd00: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
fd10: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
fd20: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
fd30: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
fd40: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
fd50: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
fd60: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
fd70: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
fd80: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
fd90: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
fda0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
fdb0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
fdc0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
fdd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
fde0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
fdf0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
fe00: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
fe10: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
fe20: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
fe30: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
fe40: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
fe50: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
fe60: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fe70: 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
fe80: 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
fe90: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
fea0: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
feb0: 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
fec0: 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
fed0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
fee0: 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  {.    if( pSelec
fef0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
ff00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ff10: 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  e, "");.      re
ff20: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
ff30: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
ff40: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
ff50: 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
ff60: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
ff70: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
ff80: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
ff90: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
ffa0: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
ffb0: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
ffc0: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
ffd0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ffe0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
fff0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10000 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10010 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10020 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
10030 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
10040 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
10050 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
10060 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10070 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
10080 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10090 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
100b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
100c0 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
100d0 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
100e0 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
100f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10100 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
10110 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
10120 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
10130 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
10140 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
10150 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
10160 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
10170 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10180 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10190 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
101a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
101b0 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
101c0 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
101d0 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
101e0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
101f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
10200 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
10210 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
10220 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
10230 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
10240 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
10250 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10260 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10270 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
10280 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
10290 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
102a0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
102b0 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
102c0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
102d0 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
102e0 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
102f0 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
10300 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
10310 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
10320 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
10330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
10340 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
10350 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
10360 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
10370 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
10380 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10390 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
103a0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
103b0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
103c0 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
103d0 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
103e0 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
103f0 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
10400 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
10410 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
10420 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
10430 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
10440 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
10450 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
10460 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
10470 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
10480 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
10490 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
104a0 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
104b0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
104c0 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
104d0 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
104e0 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
104f0 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
10500 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
10510 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10520 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
10530 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
10540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10550 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10560 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
10570 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
10580 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
10590 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
105a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
105b0 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
105c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
105d0 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
105e0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
105f0 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
10600 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
10610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10620 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
10630 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
10640 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
10650 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
10660 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
10670 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
10680 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10690 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
106a0 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
106b0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
106c0 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
106d0 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
106e0 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
106f0 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
10700 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
10710 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
10720 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
10730 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
10740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
10750 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
10760 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
10770 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
10780 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
10790 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
107a0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
107b0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
107c0 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
107d0 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
107e0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
107f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
10800 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
10810 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
10820 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
10830 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
10840 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
10850 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
10860 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
10870 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
10880 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
10890 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
108a0 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
108b0 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
108c0 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
108d0 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
108e0 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
108f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
10900 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
10910 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
10920 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
10930 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
10940 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
10950 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
10960 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
10970 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
10980 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
10990 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
109a0 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
109b0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
109c0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
109d0 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
109e0 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
109f0 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
10a00 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
10a10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
10a20 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
10a30 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
10a40 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
10a50 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10a60 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
10a70 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10a80 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
10a90 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
10aa0 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
10ab0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
10ac0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
10ad0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
10ae0 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
10af0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b00 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
10b10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10b20 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
10b30 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b40 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
10b50 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
10b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b70 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
10b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10b90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10ba0 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
10bb0 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
10bc0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10bd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10be0 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
10bf0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
10c00 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
10c10 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
10c20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10c30 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
10c40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c50 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
10c60 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
10c70 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
10c80 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c90 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
10ca0 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
10cb0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10cc0 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
10cd0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
10ce0 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
10cf0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61   return;.      a
10d00 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
10d10 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  0 );.      p->nC
10d20 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
10d30 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
10d40 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
10d50 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
10d60 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10d70 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
10d80 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10d90 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10da0 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
10db0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10dc0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
10dd0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
10de0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
10df0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10e00 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
10e10 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
10e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
10e30 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
10e40 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
10e50 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
10e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10e80 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
10e90 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
10ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10eb0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
10ec0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
10ed0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10ee0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
10ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10f00 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10f10 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10f20 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10f30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10f40 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10f50 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10f70 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10f80 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10f90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fa0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
10fb0 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
10fc0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10fd0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
10fe0 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11000 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11010 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
11020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11030 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
11040 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
11050 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
11060 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
11070 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
11080 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
11090 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
110a0 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
110b0 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
110c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
110d0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
110e0 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
110f0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
11100 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
11110 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
11120 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
11130 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
11140 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
11150 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
11160 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
11170 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11180 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
11190 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
111a0 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
111b0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
111c0 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
111d0 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
111e0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
111f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11200 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
11210 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
11220 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
11230 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
11240 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
11250 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
11260 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
11270 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
11280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
11290 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
112a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
112b0 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
112c0 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
112d0 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
112e0 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
112f0 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
11300 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
11310 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
11320 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11330 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
11340 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
11350 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
11360 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
11370 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
11380 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
11390 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
113a0 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
113b0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
113c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
113d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
113e0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
113f0 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
11400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11410 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
11420 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11430 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
11440 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
11450 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
11460 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
11470 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
11480 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
11490 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
114a0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
114b0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
114c0 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
114d0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
114e0 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
114f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11500 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
11510 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
11520 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
11530 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
11540 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
11550 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11560 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11570 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
11580 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
11590 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
115a0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
115b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
115c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
115d0 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
115e0 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
115f0 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11600 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
11610 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
11620 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
11630 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
11640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
11650 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
11660 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
11670 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
11680 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
11690 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
116a0 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
116b0 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
116c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
116d0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
116e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
116f0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
11700 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
11710 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
11720 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
11730 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11740 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11750 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
11760 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
11770 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
11780 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
11790 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
117a0 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
117b0 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
117c0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
117d0 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
117e0 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
117f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
11800 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
11810 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
11820 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
11830 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
11840 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
11850 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
11860 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
11870 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
11880 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
11890 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
118a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
118b0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
118c0 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
118d0 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
118e0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
118f0 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
11900 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
11910 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
11920 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
11930 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
11940 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11950 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
11960 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
11970 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
11980 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
11990 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
119a0 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
119b0 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
119c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
119d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
119e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
119f0 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
11a00 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
11a10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11a20 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
11a30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
11a40 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
11a50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
11a60 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11a70 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
11a80 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
11a90 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
11aa0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
11ab0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
11ac0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
11ad0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
11ae0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
11af0 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
11b00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11b10 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
11b20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
11b30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11b40 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
11b50 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
11b60 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
11b70 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
11b80 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
11b90 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
11ba0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11bb0 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
11bc0 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
11bd0 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
11be0 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
11bf0 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
11c00 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
11c10 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
11c20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
11c30 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
11c40 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
11c50 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
11c60 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
11c70 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
11c80 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
11c90 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
11ca0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
11cb0 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
11cc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11cd0 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
11ce0 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
11cf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11d00 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
11d10 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
11d20 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
11d30 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
11d40 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
11d50 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
11d60 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
11d70 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
11d80 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
11d90 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
11da0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
11db0 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
11dc0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
11dd0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
11de0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
11df0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
11e00 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
11e10 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
11e20 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
11e30 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
11e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
11e50 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
11e60 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
11e70 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
11e80 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
11e90 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
11ea0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
11eb0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
11ec0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
11ed0 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
11ee0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11ef0 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11f00 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
11f10 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
11f20 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
11f30 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
11f40 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
11f50 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
11f60 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
11f70 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
11f80 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
11f90 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
11fa0 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
11fb0 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
11fc0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
11fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52  .  */.  if( IN_R
11fe0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
11ff0 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
12000 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53   pSelect;.    pS
12010 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  elect = 0;.  }el
12020 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65  se{.    p->pSele
12030 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
12040 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
12050 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
12060 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68  E);.  }.  p->pCh
12070 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
12080 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
12090 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
120a0 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
120b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
120c0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
120d0 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
120e0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
120f0 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
12100 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
12110 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
12120 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
12130 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
12140 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
12150 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
12160 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d  ]!=0 || sEnd.n==
12170 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  0 );.  if( sEnd.
12180 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
12190 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
121a0 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
121b0 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
121c0 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
121d0 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
121e0 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n>0 );.  z = pBe
121f0 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
12200 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
12210 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
12220 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
12230 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
12240 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
12250 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
12260 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
12270 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
12280 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
12290 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
122a0 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
122b0 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65  , 0, 0);..create
122c0 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71  _view_fail:.  sq
122d0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
122e0 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
122f0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
12300 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
12310 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c  lite3RenameExprl
12320 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  istUnmap(pParse,
12330 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20   pCNames);.  }. 
12340 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12350 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
12360 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
12370 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12380 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
12390 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
123a0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
123b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
123c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
123d0 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
123e0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
123f0 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
12400 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
12410 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
12420 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
12430 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
12440 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
12450 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
12460 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
12470 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
12480 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
12490 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
124a0 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
124b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
124c0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
124d0 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
124e0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
124f0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
12500 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
12510 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
12520 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
12530 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
12540 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
12550 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
12560 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
12570 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
12580 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
12590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
125a0 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
125b0 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
125c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
125d0 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
125e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
125f0 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
12600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12610 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
12620 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12630 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
12640 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
12650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12660 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
12670 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nt rc;.#endif.#i
12680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12690 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
126a0 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
126b0 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20  xAuth;       /* 
126c0 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e  Saved xAuth poin
126d0 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ter */.#endif.. 
126e0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
126f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
12700 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12710 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65  ABLE.  db->nSche
12720 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d  maLock++;.  rc =
12730 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
12740 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
12750 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e  pTable);.  db->n
12760 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20  SchemaLock--;.  
12770 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
12780 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
12790 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
127a0 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
127b0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
127c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
127d0 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
127e0 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
127f0 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
12800 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
12810 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
12820 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
12830 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
12840 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
12850 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
12860 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
12870 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
12880 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
12890 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
128a0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
128b0 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
128c0 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
128d0 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
128e0 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
128f0 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
12900 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
12910 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
12920 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
12930 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
12940 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
12950 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
12960 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
12970 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
12980 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
12990 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
129a0 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
129b0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
129c0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
129d0 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
129e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
129f0 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
12a00 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
12a10 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
12a20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
12a30 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
12a40 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
12a50 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
12a60 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
12a70 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
12a80 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
12a90 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
12aa0 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
12ab0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
12ac0 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
12ad0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ae0 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
12af0 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
12b00 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
12b10 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
12b20 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
12b30 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
12b40 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
12b50 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
12b60 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
12b70 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
12b80 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
12b90 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
12ba0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
12bb0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12bc0 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
12bd0 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
12be0 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
12bf0 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
12c00 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
12c10 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
12c20 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
12c30 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
12c40 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
12c50 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
12c60 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
12c70 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
12c80 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
12c90 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
12ca0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
12cb0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
12cc0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
12cd0 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
12ce0 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
12cf0 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
12d00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
12d10 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
12d20 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
12d30 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65  ( pSel ){.#ifnde
12d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
12d50 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20  TERTABLE.    u8 
12d60 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61  eParseMode = pPa
12d70 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b  rse->eParseMode;
12d80 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
12d90 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f  rseMode = PARSE_
12da0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e  MODE_NORMAL;.#en
12db0 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  dif.    n = pPar
12dc0 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
12dd0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
12de0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
12df0 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
12e00 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
12e10 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
12e20 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
12e30 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
12e40 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12e50 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
12e60 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
12e70 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
12e80 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
12e90 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
12ea0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12eb0 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
12ec0 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
12ed0 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
12ee0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
12ef0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
12f00 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
12f10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
12f20 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
12f30 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
12f40 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12f50 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
12f60 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
12f70 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
12f80 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
12f90 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
12fa0 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
12fb0 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
12fc0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
12fd0 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
12fe0 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
12ff0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
13000 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
13010 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
13020 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
13030 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
13040 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
13050 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
13060 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
13070 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
13080 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
13090 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
130a0 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
130d0 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
130e0 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
130f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13100 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
13110 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
13120 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
13130 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
13140 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
13150 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13160 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
13170 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
13180 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
13190 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
131a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
131b0 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
131c0 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
131d0 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
131e0 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
131f0 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
13200 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
13210 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
13220 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
13230 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13240 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
13250 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13260 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
13270 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
13280 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13290 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
132a0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
132b0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
132c0 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
132d0 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
132e0 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
132f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13300 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
13310 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
13320 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
13330 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
13340 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
13350 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
13360 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
13370 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
13380 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
13390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
133a0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
133b0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
133c0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
133d0 2d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  -;.#ifndef SQLIT
133e0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
133f0 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50  E.    pParse->eP
13400 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73  arseMode = ePars
13410 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  eMode;.#endif.  
13420 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
13430 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  r++;.  }.  pTabl
13440 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
13450 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
13460 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66  resetViews;.  if
13470 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13480 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
13490 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
134a0 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
134b0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
134c0 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65   = 0;.    pTable
134d0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->nCol = 0;.  }.
134e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
134f0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
13500 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
13510 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13520 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13530 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
13540 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13550 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
13560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13570 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
13580 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
13590 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
135a0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
135b0 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
135c0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
135d0 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
135e0 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
135f0 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
13600 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13610 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13620 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
13630 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
13640 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
13650 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
13660 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
13670 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
13680 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
13690 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
136a0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
136b0 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
136c0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
136d0 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
136e0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
136f0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
13700 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
13710 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
13720 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
13730 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
13740 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
13750 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
13760 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
13770 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
13780 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
13790 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
137a0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
137b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
137c0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
137d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
137e0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
137f0 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
13800 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
13810 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
13820 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
13830 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
13840 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
13850 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
13860 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
13870 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
13880 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
13890 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
138a0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
138b0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
138c0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
138d0 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
138e0 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
138f0 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
13900 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
13910 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
13920 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
13930 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
13940 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
13950 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
13960 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
13970 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
13980 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
13990 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
139a0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
139b0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
139c0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
139d0 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
139e0 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
139f0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
13a00 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
13a10 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
13a20 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13a30 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
13a40 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
13a50 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
13a60 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
13a70 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
13a80 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
13a90 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
13aa0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
13ab0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
13ac0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
13ad0 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
13ae0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
13af0 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
13b00 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
13b10 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
13b20 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
13b30 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
13b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
13b60 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
13b70 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
13b80 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13b90 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
13ba0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
13bb0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
13bc0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
13bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13be0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13bf0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
13c00 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
13c10 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
13c20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
13c30 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
13c40 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
13c50 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
13c60 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
13c70 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
13c80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
13c90 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
13ca0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
13cb0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
13cc0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
13cd0 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
13ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
13cf0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
13d00 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
13d10 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
13d20 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
13d30 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
13d40 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
13d50 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
13d60 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
13d70 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
13d80 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
13d90 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
13da0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
13db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13dc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
13dd0 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
13de0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
13df0 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
13e00 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
13e10 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
13e20 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
13e30 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13e40 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
13e50 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
13e60 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
13e70 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
13e80 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
13e90 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
13ea0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
13eb0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
13ec0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
13ed0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13ee0 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
13ef0 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
13f00 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
13f10 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
13f20 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
13f30 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13f40 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13f50 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
13f60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13f70 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  );.  if( iTable<
13f80 32 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  2 ) sqlite3Error
13f90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
13fa0 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20  rupt schema");. 
13fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13fc0 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
13fd0 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
13fe0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
13ff0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
14000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14010 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14020 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
14030 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
14040 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
14050 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
14060 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
14070 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
14080 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
14090 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
140a0 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
140b0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
140c0 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
140d0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
140e0 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
140f0 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
14100 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
14110 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
14120 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
14130 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
14140 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
14150 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
14160 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
14170 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
14180 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
14190 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
141a0 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
141b0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
141c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
141d0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
141e0 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
141f0 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
14200 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
14210 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
14220 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
14230 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14240 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
14250 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  ME, iTable, r1, 
14260 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
14270 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14280 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
14290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
142a0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
142b0 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
142c0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
142d0 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
142e0 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
142f0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
14300 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
14310 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
14320 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
14330 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
14340 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
14350 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
14360 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
14370 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
14380 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
14390 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
143a0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
143b0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
143c0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
143d0 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
143e0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
143f0 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  ab){.  /* If the
14400 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
14410 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
14420 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
14430 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14440 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
14450 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
14460 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
14470 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
14480 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
14490 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
144a0 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
144b0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
144c0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
144d0 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
144e0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
144f0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
14500 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
14510 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
14520 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
14530 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
14540 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
14550 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
14560 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
14570 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
14580 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
14590 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
145a0 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
145b0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
145c0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
145d0 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
145e0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
145f0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
14600 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
14610 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
14620 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
14630 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
14640 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
14650 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
14660 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
14670 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
14680 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
14690 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
146a0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
146b0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
146c0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
146d0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
146e0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
146f0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
14700 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
14710 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
14720 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
14730 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
14740 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
14750 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
14760 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14770 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
14780 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
14790 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
147a0 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
147b0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
147c0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
147d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
147e0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
147f0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
14800 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
14810 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
14820 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
14830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14840 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
14850 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
14860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14870 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
14880 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14890 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
148a0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
148b0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
148c0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
148d0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
148e0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
148f0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
14900 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
14910 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
14920 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
14930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
14940 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
14950 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
14960 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
14970 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
14980 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
14990 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
149a0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
149b0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
149c0 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
149d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
149e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
149f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14a00 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
14a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14a20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
14a30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14a40 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
14a50 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
14a60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14a70 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
14a80 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
14a90 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
14aa0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
14ab0 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
14ac0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
14ad0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  zDbSName;.  for(
14ae0 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
14af0 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
14b00 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
14b10 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
14b20 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
14b30 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
14b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
14b50 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
14b60 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
14b70 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
14b80 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14b90 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
14ba0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14bb0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
14bc0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
14bd0 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
14be0 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
14bf0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14c10 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
14c20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
14c30 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
14c40 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
14c50 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
14c60 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
14c70 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
14c80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14c90 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
14ca0 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
14cb0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
14cc0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
14cd0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14ce0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
14cf0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
14d00 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14d10 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14d20 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
14d30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14d40 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
14d50 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d70 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
14d80 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
14d90 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
14da0 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
14db0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
14dc0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
14dd0 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
14de0 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
14df0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
14e00 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
14e10 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
14e20 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
14e30 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
14e40 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
14e50 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
14e60 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
14e70 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
14e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
14e90 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
14ea0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
14eb0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
14ec0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
14ed0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
14ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
14ef0 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
14f00 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
14f10 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
14f20 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
14f30 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14f40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
14f50 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
14f60 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
14f70 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
14f80 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
14f90 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
14fa0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
14fb0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
14fc0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
14fd0 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
14fe0 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
14ff0 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
15000 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
15010 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
15020 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
15030 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15040 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
15050 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
15060 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
15070 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
15080 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
15090 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
150a0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
150b0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
150c0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
150d0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
150e0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
150f0 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
15100 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15110 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
15120 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
15130 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
15140 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
15150 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
15160 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
15170 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
15180 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
15190 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
151a0 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
151b0 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
151c0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
151d0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
151e0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
151f0 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
15200 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
15210 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
15220 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
15230 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
15240 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
15250 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15260 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
15270 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
15280 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
15290 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
152a0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
152b0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
152c0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
152d0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
152e0 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
152f0 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
15300 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b->zDbSName, MAS
15310 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e  TER_NAME, pTab->
15320 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
15330 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
15340 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15350 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
15360 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
15370 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
15380 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
15390 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
153a0 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
153b0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
153c0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
153d0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
153e0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
153f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15400 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
15410 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
15420 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
15430 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15440 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
15450 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
15460 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
15470 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  0);.  sqlite3Cha
15480 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
15490 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
154a0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
154b0 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
154c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
154d0 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
154e0 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
154f0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
15500 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
15510 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
15520 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
15530 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15540 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
15550 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
15560 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
15570 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
15580 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
15590 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
155a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
155b0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
155c0 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
155d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
155e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
155f0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
15600 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
15610 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rr==0 );.  asser
15620 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
15630 31 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  1 );.  if( sqlit
15640 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
15650 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74  rse) ) goto exit
15660 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69  _drop_table;.  i
15670 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
15680 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
15690 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d  assert( isView==
156a0 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43  0 || isView==LOC
156b0 41 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70 54  ATE_VIEW );.  pT
156c0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
156d0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
156e0 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61  se, isView, &pNa
156f0 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28  me->a[0]);.  if(
15700 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
15710 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69  pressErr--;..  i
15720 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
15730 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71    if( noErr ) sq
15740 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
15750 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
15760 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
15770 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67  Database);.    g
15780 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15790 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
157a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
157b0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
157c0 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
157d0 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
157e0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
157f0 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
15800 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
15810 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
15820 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
15830 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
15840 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
15850 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
15860 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
15870 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
15880 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
15890 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
158a0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
158b0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
158c0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
158d0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
158e0 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
158f0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
15900 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
15910 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15920 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
15930 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
15940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
15950 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g2 = 0;.    if( 
15960 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
15970 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
15980 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
15990 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
159a0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
159b0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
159c0 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
159d0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
159e0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
159f0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
15a00 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
15a10 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
15a20 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
15a30 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
15a40 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  EW;.      }.#ifn
15a50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15a60 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
15a70 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
15a80 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
15a90 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
15aa0 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20  E_DROP_VTABLE;. 
15ab0 20 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c       zArg2 = sql
15ac0 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
15ad0 2c 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a  , pTab)->pMod->z
15ae0 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Name;.#endif.   
15af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
15b00 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
15b10 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20  & iDb==1 ){.    
15b20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
15b30 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c  E_DROP_TEMP_TABL
15b40 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  E;.      }else{.
15b50 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
15b60 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45  QLITE_DROP_TABLE
15b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15b80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
15b90 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
15ba0 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61   code, pTab->zNa
15bb0 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20  me, zArg2, zDb) 
15bc0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
15bd0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15be0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
15bf0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15c00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
15c10 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ETE, pTab->zName
15c20 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
15c30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15c40 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
15c50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15c60 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
15c70 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
15c80 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
15c90 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
15ca0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
15cb0 65 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22  e, "sqlite_stat"
15cc0 2c 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 11)!=0 ){.    
15cd0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15ce0 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
15cf0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
15d00 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
15d10 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
15d20 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15d30 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
15d40 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
15d50 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
15d60 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
15d70 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
15d80 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
15d90 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
15da0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
15db0 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
15dc0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
15dd0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15de0 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
15df0 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
15e00 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
15e10 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
15e20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15e30 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
15e40 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
15e50 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
15e60 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15e70 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
15e80 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
15e90 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
15ea0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
15eb0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15ec0 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
15ed0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
15ee0 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
15ef0 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
15f00 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
15f10 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
15f20 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
15f30 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15f40 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
15f50 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
15f60 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
15f70 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 69 66   1, iDb);.    if
15f80 28 20 21 69 73 56 69 65 77 20 29 7b 0a 20 20 20  ( !isView ){.   
15f90 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
15fa0 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
15fb0 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54  , iDb, "tbl", pT
15fc0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15fd0 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54    sqlite3FkDropT
15fe0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
15ff0 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  me, pTab);.    }
16000 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
16010 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
16020 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
16030 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
16040 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
16050 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
16060 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
16070 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16080 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
16090 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
160a0 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
160b0 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
160c0 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
160d0 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
160e0 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
160f0 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
16100 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
16110 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
16120 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
16130 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
16140 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
16150 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
16160 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
16170 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
16180 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
16190 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ble referred to 
161a0 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65  (a.k.a the "pare
161b0 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f  nt" table).  pTo
161c0 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a  Col is a list.**
161d0 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
161e0 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62  e parent pTo tab
161f0 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  le.  flags conta
16200 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
16210 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
16220 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
16230 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
16240 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
16250 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
16260 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
16270 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
16280 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
16290 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
162a0 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
162b0 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
162c0 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
162d0 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
162e0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
162f0 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  le field..**.** 
16300 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
16310 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
16320 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
16330 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
16340 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
16350 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
16360 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
16370 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
16380 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16390 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
163a0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
163b0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
163c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
163d0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
163e0 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
163f0 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
16400 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
16410 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
16420 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
16430 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16440 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
16450 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
16460 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
16470 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
16480 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
16490 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
164a0 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
164b0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
164c0 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ms. */.){.  sqli
164d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
164e0 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
164f0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
16500 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
16510 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20  Key = 0;.  FKey 
16520 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c  *pNextTo;.  Tabl
16530 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
16540 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
16550 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
16560 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
16570 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
16580 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
16590 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  ( p==0 || IN_DEC
165a0 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
165b0 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
165c0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
165d0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
165e0 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
165f0 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20  NEVER(iCol<0) ) 
16600 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
16610 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
16620 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
16630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16640 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16650 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
16660 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
16670 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
16680 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
16690 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
166a0 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
166b0 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
166c0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
166d0 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
166e0 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
166f0 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
16700 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
16710 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
16720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16730 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
16740 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
16750 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
16760 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
16770 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
16780 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
16790 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
167a0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
167b0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
167c0 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
167d0 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
167e0 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
167f0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
16800 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  FKey) + (nCol-1)
16810 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
16820 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
16830 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
16840 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
16850 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
16860 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
16870 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
16880 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
16890 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
168a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
168b0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Key = sqlite3DbM
168c0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
168d0 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
168e0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
168f0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
16900 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
16910 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
16920 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
16930 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
16940 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  FKey->aCol[nCol]
16950 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
16960 20 7a 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e   z;.  if( IN_REN
16970 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
16980 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
16990 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
169a0 28 76 6f 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a  (void*)z, pTo);.
169b0 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20    }.  memcpy(z, 
169c0 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
169d0 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
169e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
169f0 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54  te(z);.  z += pT
16a00 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
16a10 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
16a20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
16a30 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
16a40 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
16a50 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
16a60 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
16a70 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
16a80 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
16a90 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
16aa0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
16ab0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
16ac0 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
16ad0 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
16ae0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
16af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
16b00 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
16b10 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
16b20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16b30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16b40 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
16b50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16b60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
16b70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
16b80 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
16b90 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
16ba0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
16bb0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
16bc0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
16bd0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
16be0 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
16bf0 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41       if( IN_RENA
16c00 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
16c10 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
16c20 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61  meTokenRemap(pPa
16c30 72 73 65 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f  rse, &pFKey->aCo
16c40 6c 5b 69 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e  l[i], pFromCol->
16c50 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
16c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16c70 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
16c80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
16c90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
16ca0 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
16cb0 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e  trlen30(pToCol->
16cc0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
16cd0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69     pFKey->aCol[i
16ce0 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20  ].zCol = z;.    
16cf0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
16d00 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
16d10 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
16d20 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
16d30 2c 20 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69  , z, pToCol->a[i
16d40 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
16d50 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  }.      memcpy(z
16d60 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
16d70 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
16d80 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
16d90 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
16da0 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
16db0 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
16dc0 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  FKey->aAction[0]
16dd0 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
16de0 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20  0xff);          
16df0 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61    /* ON DELETE a
16e00 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79  ction */.  pFKey
16e10 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28  ->aAction[1] = (
16e20 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20  u8)((flags >> 8 
16e30 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a  ) & 0xff);    /*
16e40 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
16e50 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
16e60 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
16e70 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d  exHeld(db, 0, p-
16e80 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70  >pSchema) );.  p
16e90 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a  NextTo = (FKey *
16ea0 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65  )sqlite3HashInse
16eb0 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
16ec0 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20  fkeyHash, .     
16ed0 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f   pFKey->zTo, (vo
16ee0 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a  id *)pFKey.  );.
16ef0 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70    if( pNextTo==p
16f00 46 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  FKey ){.    sqli
16f10 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
16f20 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
16f30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78  ;.  }.  if( pNex
16f40 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tTo ){.    asser
16f50 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65  t( pNextTo->pPre
16f60 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  vTo==0 );.    pF
16f70 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  Key->pNextTo = p
16f80 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78  NextTo;.    pNex
16f90 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70  tTo->pPrevTo = p
16fa0 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  FKey;.  }..  /* 
16fb0 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
16fc0 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
16fd0 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
16fe0 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
16ff0 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
17000 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
17010 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
17020 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
17030 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
17040 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
17050 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
17060 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
17070 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
17080 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
17090 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
170a0 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
170b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
170c0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
170d0 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
170e0 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
170f0 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
17100 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
17110 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
17120 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
17130 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
17140 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
17150 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
17160 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
17170 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
17180 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
17190 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
171a0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
171b0 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
171c0 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
171d0 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
171e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
171f0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
17200 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
17210 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
17220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17230 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
17240 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
17250 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
17260 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
17270 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
17280 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
17290 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
172a0 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
172b0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c   isDeferred==0 |
172c0 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20  | isDeferred==1 
172d0 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32  ); /* EV: R-3032
172e0 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b  3-21917 */.  pFK
172f0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
17300 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
17310 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
17320 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17330 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
17340 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
17350 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
17360 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
17370 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
17380 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
17390 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
173a0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
173b0 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
173c0 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
173d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
173e0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
173f0 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
17400 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
17410 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
17420 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
17430 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
17440 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
17450 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
17460 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
17470 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
17480 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
17490 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
174a0 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
174b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
174c0 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
174d0 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
174e0 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
174f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
17500 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
17510 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
17520 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
17530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
17540 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
17550 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
17560 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
17570 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
17580 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
17590 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
175a0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
175b0 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
175c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
175d0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
175e0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
175f0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
17600 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
17610 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17620 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
17630 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
17640 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53  ndex */.  int iS
17650 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  orter;          
17660 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
17670 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65  or opened by Ope
17680 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75  nSorter (if in u
17690 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  se) */.  int add
176a0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
176b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
176c0 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
176d0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32  p */.  int addr2
176e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
176f0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
17700 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20   to jump to for 
17710 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a  next iteration *
17720 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
17750 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
17760 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b  t iPartIdxLabel;
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17780 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62  Jump to this lab
17790 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77  el to skip a row
177a0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
177d0 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
177e0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
177f0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
17800 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
17810 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66      /* KeyInfo f
17820 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
17830 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17850 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
17860 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78   assembled index
17870 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
17880 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
17890 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
178a0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
178b0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
178c0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
178d0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
178e0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
178f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17900 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
17910 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
17920 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17930 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
17940 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
17950 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
17960 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
17970 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
17980 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17990 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69  /* Require a wri
179a0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  te-lock on the t
179b0 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  able to perform 
179c0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
179d0 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
179e0 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
179f0 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c  , pTab->tnum, 1,
17a00 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
17a10 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
17a20 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
17a30 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
17a40 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
17a50 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74  Page>=0 ){.    t
17a60 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67  num = memRootPag
17a70 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
17a80 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
17a90 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20  num;.  }.  pKey 
17aa0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
17ab0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
17ac0 70 49 6e 64 65 78 29 3b 0a 20 20 61 73 73 65 72  pIndex);.  asser
17ad0 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62  t( pKey!=0 || db
17ae0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
17af0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
17b00 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
17b10 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69   sorter cursor i
17b20 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65 20  f we are to use 
17b30 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65  one. */.  iSorte
17b40 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
17b50 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
17b60 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
17b70 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65  rterOpen, iSorte
17b80 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b  r, 0, pIndex->nK
17b90 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20  eyCol, (char*). 
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
17bc0 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b  oRef(pKey), P4_K
17bd0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f  EYINFO);..  /* O
17be0 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c  pen the table. L
17bf0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
17c00 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
17c10 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64  e, inserting ind
17c20 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20  ex.  ** records 
17c30 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
17c40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65   */.  sqlite3Ope
17c50 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
17c60 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
17c70 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
17c80 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
17c90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17ca0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
17cb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17cc0 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
17cd0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17ce0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
17cf0 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
17d00 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69  pParse);..  sqli
17d10 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
17d20 4b 65 79 28 70 50 61 72 73 65 2c 70 49 6e 64 65  Key(pParse,pInde
17d30 78 2c 69 54 61 62 2c 72 65 67 52 65 63 6f 72 64  x,iTab,regRecord
17d40 2c 30 2c 26 69 50 61 72 74 49 64 78 4c 61 62 65  ,0,&iPartIdxLabe
17d50 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65  l,0,0);.  sqlite
17d60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17d70 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
17d80 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f  iSorter, regReco
17d90 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
17da0 73 6f 6c 76 65 50 61 72 74 49 64 78 4c 61 62 65  solvePartIdxLabe
17db0 6c 28 70 50 61 72 73 65 2c 20 69 50 61 72 74 49  l(pParse, iPartI
17dc0 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  dxLabel);.  sqli
17dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17de0 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
17df0 61 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f  addr1+1); VdbeCo
17e00 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
17e10 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17e20 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66  (v, addr1);.  if
17e30 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20  ( memRootPage<0 
17e40 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
17e50 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
17e60 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73   tnum, iDb);.  s
17e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17e80 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
17e90 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44  , iIdx, tnum, iD
17ea0 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
17eb0 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29          (char *)
17ec0 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
17ed0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17ee0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
17ef0 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d  AG_BULKCSR|((mem
17f00 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46  RootPage>=0)?OPF
17f10 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b  LAG_P2ISREG:0));
17f20 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ..  addr1 = sqli
17f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17f40 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
17f50 69 53 6f 72 74 65 72 2c 20 30 29 3b 20 56 64 62  iSorter, 0); Vdb
17f60 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17f70 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
17f80 78 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  x(pIndex) ){.   
17f90 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
17fa0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b  3VdbeGoto(v, 1);
17fb0 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
17fc0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
17fd0 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
17fe0 74 65 33 56 64 62 65 56 65 72 69 66 79 41 62 6f  te3VdbeVerifyAbo
17ff0 72 74 61 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f  rtable(v, OE_Abo
18000 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
18010 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
18020 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72   OP_SorterCompar
18030 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20  e, iSorter, j2, 
18040 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20  regRecord,.     
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79      pIndex->nKey
18070 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Col); VdbeCovera
18080 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
18090 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69  e3UniqueConstrai
180a0 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62  nt(pParse, OE_Ab
180b0 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  ort, pIndex);.  
180c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
180d0 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20  pHere(v, j2);.  
180e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32  }else{.    addr2
180f0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
18100 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
18110 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
18120 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
18130 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c  erData, iSorter,
18140 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64 78   regRecord, iIdx
18150 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18160 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65  AddOp1(v, OP_See
18170 6b 45 6e 64 2c 20 69 49 64 78 29 3b 0a 20 20 73  kEnd, iIdx);.  s
18180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18190 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
181a0 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72  , iIdx, regRecor
181b0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
181c0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
181d0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
181e0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
181f0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
18200 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
18210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18220 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
18230 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61  Next, iSorter, a
18240 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72  ddr2); VdbeCover
18250 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
18260 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
18270 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69   addr1);..  sqli
18280 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18290 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29   OP_Close, iTab)
182a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
182b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
182c0 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  e, iIdx);.  sqli
182d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
182e0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74   OP_Close, iSort
182f0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  er);.}../*.** Al
18300 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63  locate heap spac
18310 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64  e to hold an Ind
18320 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ex object with n
18330 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  Col columns..**.
18340 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  ** Increase the 
18350 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
18360 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78  to provide an ex
18370 74 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73  tra nExtra bytes
18380 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c  .** of 8-byte al
18390 69 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65  igned space afte
183a0 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
183b0 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a  ct and return a.
183c0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
183d0 69 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69  is extra space i
183e0 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49  n *ppExtra..*/.I
183f0 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c  ndex *sqlite3All
18400 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74  ocateIndexObject
18410 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
18420 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
18430 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
18440 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20  */.  i16 nCol,  
18450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
18460 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  al number of col
18470 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
18480 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  x */.  int nExtr
18490 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  a,          /* N
184a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
184b0 66 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f  f extra space to
184c0 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72   alloc */.  char
184d0 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20   **ppExtra      
184e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
184f0 68 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65  he "extra" space
18500 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
18510 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
18520 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78   Allocated index
18530 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
18540 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
18550 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
18560 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62  ace for Index ob
18570 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f  ject + arrays */
18580 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ..  nByte = ROUN
18590 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29  D8(sizeof(Index)
185a0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
185b0 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
185c0 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ure  */.        
185d0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
185e0 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20  char*)*nCol) +  
185f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
18600 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
18610 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73          ROUND8(s
18620 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e  izeof(LogEst)*(n
18630 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20  Col+1) +     /* 
18640 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73  Index.aiRowLogEs
18650 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  t   */.         
18660 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69          sizeof(i
18670 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20  16)*nCol +      
18680 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
18690 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20  iColumn   */.   
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
186b0 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20  zeof(u8)*nCol); 
186c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
186d0 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
186e0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
186f0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
18700 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29   nByte + nExtra)
18710 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
18720 20 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20   char *pExtra = 
18730 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44  ((char*)p)+ROUND
18740 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
18750 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20  ;.    p->azColl 
18760 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
18770 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b  pExtra; pExtra +
18780 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
18790 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20  char*)*nCol);.  
187a0 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74    p->aiRowLogEst
187b0 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74   = (LogEst*)pExt
187c0 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69  ra; pExtra += si
187d0 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
187e0 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69  ol+1);.    p->ai
187f0 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70  Column = (i16*)p
18800 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78  Extra;       pEx
18810 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
18820 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e  6)*nCol;.    p->
18830 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
18840 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d  *)pExtra;.    p-
18850 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b  >nColumn = nCol;
18860 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20  .    p->nKeyCol 
18870 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  = nCol - 1;.    
18880 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61  *ppExtra = ((cha
18890 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20  r*)p) + nByte;. 
188a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
188b0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
188c0 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61   new index for a
188d0 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e  n SQL table.  pN
188e0 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74  ame1.pName2 is t
188f0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
18900 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62  ndex .** and pTb
18910 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d  lList is the nam
18920 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
18930 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
18940 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c  exed.  Both will
18950 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72   .** be NULL for
18960 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
18970 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  r an index that 
18980 69 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61  is created to sa
18990 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55  tisfy a.** UNIQU
189a0 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49  E constraint.  I
189b0 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e  f pTable and pIn
189c0 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73  dex are NULL, us
189d0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
189e0 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  ble.** as the ta
189f0 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
18a00 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  d.  pParse->pNew
18a10 54 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65  Table is a table
18a20 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72   that is.** curr
18a30 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
18a40 74 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45  tructed by a CRE
18a50 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
18a60 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74  ent..**.** pList
18a70 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f   is a list of co
18a80 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
18a90 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c  xed.  pList will
18aa0 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73   be NULL if this
18ab0 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79  .** is a primary
18ac0 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63   key or unique-c
18ad0 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65  onstraint on the
18ae0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c   most recent col
18af0 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20  umn added.** to 
18b00 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
18b10 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
18b20 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69  uction.  .*/.voi
18b30 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  d sqlite3CreateI
18b40 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
18b50 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
18b60 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
18b70 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
18b80 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
18b90 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
18ba0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
18bb0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
18bc0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
18bd0 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
18be0 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
18bf0 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
18c00 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
18c10 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
18c20 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
18c30 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18c40 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
18c50 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
18c60 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
18c70 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
18c80 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
18c90 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
18ca0 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
18cb0 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
18cc0 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
18cd0 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
18ce0 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
18cf0 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
18d00 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
18d10 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57   */.  Expr *pPIW
18d20 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52  here,    /* WHER
18d30 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72  E clause for par
18d40 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tial indices */.
18d50 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
18d60 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
18d70 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
18d80 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
18d90 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
18da0 74 45 78 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d  tExist,    /* Om
18db0 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
18dc0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
18dd0 20 2a 2f 0a 20 20 75 38 20 69 64 78 54 79 70 65   */.  u8 idxType
18de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18df0 69 6e 64 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b  index type */.){
18e00 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
18e10 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65   0;     /* Table
18e20 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
18e30 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
18e40 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  x = 0;   /* The 
18e50 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61  index to be crea
18e60 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ted */.  char *z
18e70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Name = 0;     /*
18e80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   Name of the ind
18e90 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  ex */.  int nNam
18ea0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18eb0 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
18ec0 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f  ters in zName */
18ed0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44  .  int i, j;.  D
18ee0 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20  bFixer sFix;    
18ef0 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67      /* For assig
18f00 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61  ning database na
18f10 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f  mes to pTable */
18f20 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
18f30 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20  Mask;   /* 1 to 
18f40 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e  honor DESC in in
18f50 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72  dex.  0 to ignor
18f60 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  e. */.  sqlite3 
18f70 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
18f80 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  ;.  Db *pDb;    
18f90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18fa0 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63  specific table c
18fb0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
18fc0 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a  dexed database *
18fd0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
18fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18ff0 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
19000 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  e that is being 
19010 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b  written */.  Tok
19020 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20  en *pName = 0;  
19030 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
19040 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
19050 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  ex to create */.
19060 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
19070 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65  t_item *pListIte
19080 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  m; /* For loopin
19090 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a  g over pList */.
190a0 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
190b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
190c0 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
190d0 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61  cated for zExtra
190e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  [] */.  int nExt
190f0 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  raCol;          
19100 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19110 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75  er of extra colu
19120 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  mns needed */.  
19130 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30  char *zExtra = 0
19140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19150 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
19160 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
19170 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65  object */.  Inde
19180 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20  x *pPk = 0;     
19190 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
191a0 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55  index for WITHOU
191b0 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
191c0 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  /..  if( db->mal
191d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
191e0 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  rse->nErr>0 ){. 
191f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
19200 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
19210 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f   if( IN_DECLARE_
19220 56 54 41 42 20 26 26 20 69 64 78 54 79 70 65 21  VTAB && idxType!
19230 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
19240 50 52 49 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20  PRIMARYKEY ){.  
19250 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19260 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
19270 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
19280 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
19290 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
192a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
192b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
192c0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
192d0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
192e0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
192f0 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
19300 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
19310 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
19320 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
19330 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
19340 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
19350 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
19360 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
19370 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
19380 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
19390 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
193a0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
193b0 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
193c0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
193d0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
193e0 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
193f0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
19400 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
19410 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
19420 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
19430 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
19440 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19450 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
19460 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
19470 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
19480 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
19490 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
194a0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
194b0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
194c0 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
194d0 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
194e0 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
194f0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
19500 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
19510 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
19520 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
19530 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
19540 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
19550 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
19560 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
19570 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
19580 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
19590 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
195a0 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
195b0 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
195c0 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
195d0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
195e0 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
195f0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
19600 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
19610 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
19620 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
19630 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
19640 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
19650 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
19660 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
19670 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
19680 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
19690 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
196a0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
196b0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
196c0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
196d0 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
196e0 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
196f0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
19700 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
19710 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
19720 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
19730 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
19740 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19750 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
19760 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
19770 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
19780 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19790 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
197a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
197b0 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
197c0 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
197d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
197e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
197f0 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
19800 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
19810 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
19820 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
19830 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
19840 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19850 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19860 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
19870 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
19880 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
19890 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
198a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
198b0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
198c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
198d0 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
198e0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
198f0 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
19900 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
19910 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19920 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
19930 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
19940 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
19950 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
19960 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
19970 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
19980 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19990 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
199a0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
199b0 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
199c0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
199d0 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
199e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
199f0 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  0.#if SQLITE_USE
19a00 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
19a10 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
19a20 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
19a30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a  pTab->zName)==0.
19a40 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
19a50 4c 49 54 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54  LITE_ALLOW_SQLIT
19a60 45 5f 4d 41 53 54 45 52 5f 49 4e 44 45 58 0a 20  E_MASTER_INDEX. 
19a70 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
19a80 53 74 72 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a  StrICmp(&pTab->z
19a90 4e 61 6d 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22  Name[7],"master"
19aa0 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20  )!=0.#endif.    
19ab0 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
19ac0 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61  NICmp(&pTab->zNa
19ad0 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f  me[7],"altertab_
19ae0 22 2c 39 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20  ",9)!=0. ){.    
19af0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19b00 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
19b10 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
19b20 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
19b30 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
19b40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19b50 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
19b60 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
19b70 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
19b80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
19b90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19ba0 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
19bb0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
19bc0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19bd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
19be0 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
19bf0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19c00 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
19c10 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
19c20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19c30 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
19c40 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
19c50 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
19c60 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
19c70 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
19c80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
19c90 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
19ca0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
19cb0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
19cc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
19cd0 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
19ce0 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
19cf0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
19d00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
19d10 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
19d20 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
19d30 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
19d40 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
19d50 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
19d60 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
19d70 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
19d80 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
19d90 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
19da0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
19db0 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
19dc0 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
19dd0 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
19de0 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
19df0 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
19e00 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
19e10 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
19e20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
19e30 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
19e40 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
19e50 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
19e60 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
19e70 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
19e80 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
19e90 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
19ea0 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
19eb0 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
19ec0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
19ed0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19ee0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
19ef0 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
19f00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19f10 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
19f20 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a   pName->z!=0 );.
19f30 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
19f40 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
19f50 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
19f60 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
19f70 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19f80 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19f90 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41      if( !IN_RENA
19fa0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
19fb0 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
19fc0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20  .busy ){.       
19fd0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
19fe0 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
19ff0 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)!=0 ){.      
1a000 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a010 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
1a020 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
1a030 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
1a040 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1a050 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1a060 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1a070 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a080 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
1a090 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
1a0a0 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  e, pDb->zDbSName
1a0b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a0c0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
1a0d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1a0e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1a0f0 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61  rse, "index %s a
1a100 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
1a110 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1a120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a130 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
1a140 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20  it.busy );.     
1a150 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
1a160 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
1a170 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1a180 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74     }.        got
1a190 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a1a0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1a1b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1a1c0 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
1a1d0 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
1a1e0 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
1a1f0 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
1a200 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
1a210 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
1a220 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1a230 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
1a240 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
1a250 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
1a260 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
1a270 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1a280 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a290 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20  _index;.    }.. 
1a2a0 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20     /* Automatic 
1a2b0 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e 65  index names gene
1a2c0 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68 69  rated from withi
1a2d0 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
1a2e0 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a 20  e_vtab().    ** 
1a2f0 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73 20  must have names 
1a300 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e 63  that are distinc
1a310 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75  t from normal au
1a320 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61  tomatic index na
1a330 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  mes..    ** The 
1a340 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
1a350 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73 71  ent converts "sq
1a360 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e  lite3_autoindex.
1a370 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20  .." into.    ** 
1a380 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64  "sqlite3_butoind
1a390 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20  ex..." in order 
1a3a0 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
1a3b0 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20 20  s distinct..    
1a3c0 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72 72  ** The "vtab_err
1a3d0 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d 6f  .test" test demo
1a3e0 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65 65  nstrates the nee
1a3f0 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65 6d  d of this statem
1a400 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ent. */.    if( 
1a410 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45  IN_SPECIAL_PARSE
1a420 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20   ) zName[7]++;. 
1a430 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66   }..  /* Check f
1a440 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  or authorization
1a450 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e   to create an in
1a460 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  dex..  */.#ifnde
1a470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a480 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
1a490 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
1a4a0 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ECT ){.    const
1a4b0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62   char *zDb = pDb
1a4c0 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ->zDbSName;.    
1a4d0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a4e0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1a4f0 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
1a500 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30  MA_TABLE(iDb), 0
1a510 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1a520 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a530 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a540 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45    i = SQLITE_CRE
1a550 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  ATE_INDEX;.    i
1a560 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
1a570 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20  && iDb==1 ) i = 
1a580 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
1a590 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1a5a0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1a5b0 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e  ck(pParse, i, zN
1a5c0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
1a5d0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1a5e0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a5f0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a600 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1a610 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d  f pList==0, it m
1a620 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e  eans this routin
1a630 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20  e was called to 
1a640 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20  make a primary. 
1a650 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74   ** key out of t
1a660 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61  he last column a
1a670 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c  dded to the tabl
1a680 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
1a690 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72  tion..  ** So cr
1a6a0 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74  eate a fake list
1a6b0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69   to simulate thi
1a6c0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  s..  */.  if( pL
1a6d0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f  ist==0 ){.    To
1a6e0 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20  ken prevCol;.   
1a6f0 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
1a700 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62  &pTab->aCol[pTab
1a710 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70  ->nCol-1];.    p
1a720 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
1a730 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b   COLFLAG_UNIQUE;
1a740 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
1a750 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c 20  nInit(&prevCol, 
1a760 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
1a770 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1a780 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1a790 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20 20  pParse, 0,.     
1a7a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a7b0 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
1a7c0 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30  _ID, &prevCol, 0
1a7d0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
1a7e0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
1a7f0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a800 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
1a810 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
1a820 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1a830 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70 4c  tSetSortOrder(pL
1a840 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b  ist, sortOrder);
1a850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1a860 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
1a870 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
1a880 20 70 4c 69 73 74 2c 20 22 69 6e 64 65 78 22 29   pList, "index")
1a890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
1a8a0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1a8b0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1a8c0 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
1a8d0 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
1a8e0 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
1a8f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1a900 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
1a910 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1a920 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1a930 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1a940 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
1a950 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1a960 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
1a970 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1a980 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
1a990 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
1a9a0 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
1a9b0 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
1a9c0 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
1a9d0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
1a9e0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
1a9f0 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
1aa00 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1aa10 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
1aa20 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
1aa30 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
1aa40 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20  l : 1;.  pIndex 
1aa50 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
1aa60 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
1aa70 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
1aa80 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20  nExtraCol,.     
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20   nName + nExtra 
1aac0 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20  + 1, &zExtra);. 
1aad0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1aae0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1aaf0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ab00 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1ab10 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1ab20 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
1ab30 61 69 52 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a  aiRowLogEst) );.
1ab40 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1ab50 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1ab60 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
1ab70 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
1ab80 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
1ab90 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
1aba0 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
1abb0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
1abc0 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
1abd0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
1abe0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
1abf0 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
1ac00 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
1ac10 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
1ac20 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
1ac30 20 20 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70    pIndex->idxTyp
1ac40 65 20 3d 20 69 64 78 54 79 70 65 3b 0a 20 20 70  e = idxType;.  p
1ac50 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d  Index->pSchema =
1ac60 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1ac70 63 68 65 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d  chema;.  pIndex-
1ac80 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74  >nKeyCol = pList
1ac90 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ->nExpr;.  if( p
1aca0 50 49 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73  PIWhere ){.    s
1acb0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1acc0 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
1acd0 65 2c 20 70 54 61 62 2c 20 4e 43 5f 50 61 72 74  e, pTab, NC_Part
1ace0 49 64 78 2c 20 70 50 49 57 68 65 72 65 2c 20 30  Idx, pPIWhere, 0
1acf0 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  );.    pIndex->p
1ad00 50 61 72 74 49 64 78 57 68 65 72 65 20 3d 20 70  PartIdxWhere = p
1ad10 50 49 57 68 65 72 65 3b 0a 20 20 20 20 70 50 49  PIWhere;.    pPI
1ad20 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Where = 0;.  }. 
1ad30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ad40 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1ad50 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a  db, iDb, 0) );..
1ad60 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
1ad70 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68  e if we should h
1ad80 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75 65 73  onor DESC reques
1ad90 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75  ts on index colu
1ada0 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
1adb0 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c  Db->pSchema->fil
1adc0 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20  e_format>=4 ){. 
1add0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
1ade0 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f   = -1;   /* Hono
1adf0 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73  r DESC */.  }els
1ae00 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  e{.    sortOrder
1ae10 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Mask = 0;    /* 
1ae20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20  Ignore DESC */. 
1ae30 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65   }..  /* Analyze
1ae40 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
1ae50 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 66 6f  ressions that fo
1ae60 72 6d 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  rm the terms of 
1ae70 74 68 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20  the index and.  
1ae80 2a 2a 20 72 65 70 6f 72 74 20 61 6e 79 20 65 72  ** report any er
1ae90 72 6f 72 73 2e 20 20 49 6e 20 74 68 65 20 63 6f  rors.  In the co
1aea0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
1aeb0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1aec0 73 20 65 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61  s exactly.  ** a
1aed0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73   table column, s
1aee0 74 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e  tore that column
1aef0 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20   in aiColumn[]. 
1af00 20 46 6f 72 20 67 65 6e 65 72 61 6c 20 65 78 70   For general exp
1af10 72 65 73 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70  ressions,.  ** p
1af20 6f 70 75 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e  opulate pIndex->
1af30 61 43 6f 6c 45 78 70 72 20 61 6e 64 20 73 74 6f  aColExpr and sto
1af40 72 65 20 58 4e 5f 45 58 50 52 20 28 2d 32 29 20  re XN_EXPR (-2) 
1af50 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20  in aiColumn[].. 
1af60 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49   **.  ** TODO: I
1af70 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69  ssue a warning i
1af80 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f  f two or more co
1af90 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
1afa0 65 78 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ex are identical
1afb0 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73  ..  ** TODO: Iss
1afc0 75 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20  ue a warning if 
1afd0 74 68 65 20 74 61 62 6c 65 20 70 72 69 6d 61 72  the table primar
1afe0 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 61 73  y key is used as
1aff0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a   part of the.  *
1b000 2a 20 69 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a  * index key..  *
1b010 2f 0a 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20  /.  pListItem = 
1b020 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20  pList->a;.  if( 
1b030 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1b040 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   ){.    pIndex->
1b050 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74  aColExpr = pList
1b060 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b  ;.    pList = 0;
1b070 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1b080 69 3c 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  i<pIndex->nKeyCo
1b090 6c 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65  l; i++, pListIte
1b0a0 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
1b0b0 70 43 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  pCExpr;         
1b0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b0d0 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70 72 65  i-th index expre
1b0e0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ssion */.    int
1b0f0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
1b100 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  der;        /* A
1b110 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20 74 68  SC or DESC on th
1b120 65 20 69 2d 74 68 20 65 78 70 72 65 73 73 69 6f  e i-th expressio
1b130 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  n */.    const c
1b140 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
1b150 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
1b160 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
1b170 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74  me */..    sqlit
1b180 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 4c 69  e3StringToId(pLi
1b190 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  stItem->pExpr);.
1b1a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
1b1b0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
1b1c0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
1b1d0 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73 74 49  _IdxExpr, pListI
1b1e0 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a  tem->pExpr, 0);.
1b1f0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b200 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78 69 74  nErr ) goto exit
1b210 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b220 20 20 20 70 43 45 78 70 72 20 3d 20 73 71 6c 69     pCExpr = sqli
1b230 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1b240 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  te(pListItem->pE
1b250 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  xpr);.    if( pC
1b260 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
1b270 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  UMN ){.      if(
1b280 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70   pTab==pParse->p
1b290 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
1b2a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b2b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
1b2c0 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69 62 69  ressions prohibi
1b2d0 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59 20 4b  ted in PRIMARY K
1b2e0 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20 20 20  EY and ".       
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 20 20 20 20 22 55 4e 49 51 55 45           "UNIQUE
1b310 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
1b320 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1b330 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1b340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b350 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  ( pIndex->aColEx
1b360 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pr==0 ){.       
1b370 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1b380 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  r = pList;.     
1b390 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
1b3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
1b3b0 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
1b3c0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1b3d0 69 5d 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20  i] = XN_EXPR;.  
1b3e0 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
1b3f0 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
1b400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20   }else{.      j 
1b410 3d 20 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  = pCExpr->iColum
1b420 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
1b430 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20   j<=0x7fff );.  
1b440 20 20 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20      if( j<0 ){. 
1b450 20 20 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d         j = pTab-
1b460 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  >iPKey;.      }e
1b470 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43  lse if( pTab->aC
1b480 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  ol[j].notNull==0
1b490 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
1b4a0 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
1b4b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b4c0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1b4d0 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b  umn[i] = (i16)j;
1b4e0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c  .    }.    zColl
1b4f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1b500 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
1b510 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
1b520 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
1b530 6c 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  l;.      zColl =
1b540 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1b550 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
1b560 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
1b570 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
1b580 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
1b590 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
1b5a0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
1b5b0 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
1b5c0 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
1b5d0 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
1b5e0 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
1b5f0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
1b600 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
1b610 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30    }else if( j>=0
1b620 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20   ){.      zColl 
1b630 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
1b640 7a 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  zColl;.    }.   
1b650 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
1b660 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
1b670 42 49 4e 41 52 59 3b 0a 20 20 20 20 69 66 28 20  BINARY;.    if( 
1b680 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
1b690 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  & !sqlite3Locate
1b6a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1b6b0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
1b6c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b6d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1b6e0 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1b6f0 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20  [i] = zColl;.   
1b700 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
1b710 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  der = pListItem-
1b720 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72  >sortOrder & sor
1b730 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20  tOrderMask;.    
1b740 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1b750 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75  er[i] = (u8)requ
1b760 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
1b770 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
1b780 20 74 68 65 20 74 61 62 6c 65 20 6b 65 79 20 74   the table key t
1b790 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1b7a0 20 69 6e 64 65 78 2e 20 20 46 6f 72 20 57 49 54   index.  For WIT
1b7b0 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20  HOUT ROWID.  ** 
1b7c0 74 61 62 6c 65 73 20 28 77 68 65 6e 20 70 50 6b  tables (when pPk
1b7d0 21 3d 30 29 20 74 68 69 73 20 77 69 6c 6c 20 62  !=0) this will b
1b7e0 65 20 74 68 65 20 64 65 63 6c 61 72 65 64 20 50  e the declared P
1b7f0 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
1b800 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62  .  ** normal tab
1b810 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30  les (when pPk==0
1b820 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1b830 68 65 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20  he rowid..  */. 
1b840 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
1b850 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
1b860 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
1b870 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b       int x = pPk
1b880 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
1b890 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e 3d       assert( x>=
1b8a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  0 );.      if( h
1b8b0 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d  asColumn(pIndex-
1b8c0 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65  >aiColumn, pInde
1b8d0 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29  x->nKeyCol, x) )
1b8e0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1b8f0 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20  ->nColumn--; .  
1b900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b910 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1b920 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20  umn[i] = x;.    
1b930 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
1b940 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[i] = pPk->azC
1b950 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
1b960 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
1b970 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f  er[i] = pPk->aSo
1b980 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
1b990 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d      i++;.      }
1b9a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1b9b0 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43  t( i==pIndex->nC
1b9c0 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65  olumn );.  }else
1b9d0 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
1b9e0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52  Column[i] = XN_R
1b9f0 4f 57 49 44 3b 0a 20 20 20 20 70 49 6e 64 65 78  OWID;.    pIndex
1ba00 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  ->azColl[i] = sq
1ba10 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1ba20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66    }.  sqlite3Def
1ba30 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65  aultRowEst(pInde
1ba40 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  x);.  if( pParse
1ba50 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
1ba60 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
1ba70 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  dth(pIndex);..  
1ba80 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
1ba90 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 20   contains every 
1baa0 63 6f 6c 75 6d 6e 20 6f 66 20 69 74 73 20 74 61  column of its ta
1bab0 62 6c 65 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20  ble, then mark. 
1bac0 20 2a 2a 20 69 74 20 61 73 20 61 20 63 6f 76 65   ** it as a cove
1bad0 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ring index */.  
1bae0 61 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64  assert( HasRowid
1baf0 28 70 54 61 62 29 20 0a 20 20 20 20 20 20 7c 7c  (pTab) .      ||
1bb00 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c   pTab->iPKey<0 |
1bb10 7c 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  | sqlite3ColumnO
1bb20 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 20 70  fIndex(pIndex, p
1bb30 54 61 62 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29  Tab->iPKey)>=0 )
1bb40 3b 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c  ;.  recomputeCol
1bb50 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70  umnsNotIndexed(p
1bb60 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 54  Index);.  if( pT
1bb70 62 6c 4e 61 6d 65 21 3d 30 20 26 26 20 70 49 6e  blName!=0 && pIn
1bb80 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54  dex->nColumn>=pT
1bb90 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
1bba0 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76 65 72 69  pIndex->isCoveri
1bbb0 6e 67 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  ng = 1;.    for(
1bbc0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
1bbd0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
1bbe0 66 28 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  f( j==pTab->iPKe
1bbf0 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
1bc00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43      if( sqlite3C
1bc10 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e  olumnOfIndex(pIn
1bc20 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74  dex,j)>=0 ) cont
1bc30 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64  inue;.      pInd
1bc40 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1bc50 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1bc60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1bc70 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1bc80 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1bc90 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
1bca0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1bcb0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
1bcc0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
1bcd0 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
1bce0 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
1bcf0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1bd00 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
1bd10 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
1bd20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
1bd30 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1bd40 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
1bd50 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
1bd60 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
1bd70 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
1bd80 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1bd90 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
1bda0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
1bdb0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1bdc0 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
1bdd0 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
1bde0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
1bdf0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1be00 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
1be10 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
1be20 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
1be30 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
1be40 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
1be50 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
1be60 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
1be70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1be80 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
1be90 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
1bea0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
1beb0 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
1bec0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1bed0 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
1bee0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1bef0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
1bf00 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
1bf10 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
1bf20 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
1bf30 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
1bf40 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
1bf50 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
1bf60 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
1bf70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1bf80 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
1bf90 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
1bfa0 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
1bfb0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
1bfc0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
1bfd0 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
1bfe0 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
1bff0 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
1c000 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
1c010 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
1c020 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
1c030 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
1c040 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
1c050 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1c060 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1c070 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
1c080 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1c090 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
1c0a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1c0b0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1c0c0 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
1c0d0 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
1c0e0 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1c0f0 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
1c100 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
1c110 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
1c120 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
1c130 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
1c140 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
1c150 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
1c160 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
1c170 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
1c180 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1c190 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
1c1a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
1c1b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c1c0 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1c1d0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
1c1e0 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
1c1f0 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
1c200 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
1c210 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  k;.        z1 = 
1c220 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
1c230 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49  .        z2 = pI
1c240 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
1c250 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1c260 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1c270 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
1c280 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
1c290 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
1c2a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1c2b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
1c2c0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
1c2d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1c2e0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
1c2f0 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
1c300 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
1c310 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
1c320 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
1c330 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
1c340 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
1c350 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
1c360 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
1c370 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
1c380 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
1c390 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
1c3a0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
1c3b0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1c3c0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
1c3d0 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
1c3e0 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
1c3f0 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
1c400 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
1c410 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
1c420 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
1c430 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
1c440 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
1c450 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
1c460 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  avior for the in
1c470 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1c480 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1c490 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
1c4a0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
1c4b0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1c4c0 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
1c4d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1c4e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c4f0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1c500 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
1c510 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1c520 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
1c530 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
1c540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c550 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1c560 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
1c570 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
1c580 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
1c590 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
1c5a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1c5b0 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79         if( idxTy
1c5c0 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
1c5d0 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20  PE_PRIMARYKEY ) 
1c5e0 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  pIdx->idxType = 
1c5f0 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20  idxType;.       
1c600 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c610 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1c620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1c630 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
1c640 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c  ECT ){..    /* L
1c650 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
1c660 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
1c670 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
1c680 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  the other.    **
1c690 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1c6a0 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
1c6b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1c6c0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1c6d0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ==0 );.    if( d
1c6e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1c6f0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
1c700 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 49        assert( !I
1c710 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1c720 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c730 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1c740 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1c750 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1c760 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c  );.      p = sql
1c770 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1c780 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1c790 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1c7a0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1c7b0 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1c7c0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1c7d0 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1c7e0 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
1c7f0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1c800 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
1c810 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1c820 64 62 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  db);.        got
1c830 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c840 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1c850 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
1c860 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
1c870 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66  Change;.      if
1c880 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1c890 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1c8a0 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1c8b0 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20  .newTnum;.      
1c8c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c8d0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69  If this is the i
1c8e0 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e  nitial CREATE IN
1c8f0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f  DEX statement (o
1c900 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69  r CREATE TABLE i
1c910 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 64  f the.    ** ind
1c920 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1c930 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1c940 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1c950 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1c960 68 65 6e 0a 20 20 20 20 2a 2a 20 65 6d 69 74 20  hen.    ** emit 
1c970 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  code to allocate
1c980 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70   the index rootp
1c990 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20  age on disk and 
1c9a0 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f  make an entry fo
1c9b0 72 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64  r.    ** the ind
1c9c0 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65  ex in the sqlite
1c9d0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e  _master table an
1c9e0 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69  d populate the i
1c9f0 6e 64 65 78 20 77 69 74 68 0a 20 20 20 20 2a 2a  ndex with.    **
1ca00 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20   content.  But, 
1ca10 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  do not do this i
1ca20 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20  f we are simply 
1ca30 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
1ca40 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a  te_master.    **
1ca50 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20   table to parse 
1ca60 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69  the schema, or i
1ca70 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  f this index is 
1ca80 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
1ca90 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 6f 66 20  index.    ** of 
1caa0 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1cab0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
1cac0 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65    ** If pTblName
1cad0 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69  ==0 it means thi
1cae0 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72  s index is gener
1caf0 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69  ated as an impli
1cb00 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20  ed PRIMARY KEY. 
1cb10 20 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20     ** or UNIQUE 
1cb20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1cb30 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1cb40 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1cb50 62 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6a  ble.    ** has j
1cb60 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64  ust been created
1cb70 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  , it contains no
1cb80 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e   data and the in
1cb90 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  dex initializati
1cba0 6f 6e 0a 20 20 20 20 2a 2a 20 73 74 65 70 20 63  on.    ** step c
1cbb0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
1cbc0 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
1cbd0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1cbe0 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30  ) || pTblName!=0
1cbf0 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a   ){.      Vdbe *
1cc00 76 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  v;.      char *z
1cc10 53 74 6d 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Stmt;.      int 
1cc20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1cc30 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 76 20  >nMem;..      v 
1cc40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1cc50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1cc60 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1cc70 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1cc80 78 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x;..      sqlite
1cc90 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1cca0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
1ccb0 69 44 62 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  iDb);..      /* 
1ccc0 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
1ccd0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
1cce0 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49 6e  x using CreateIn
1ccf0 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65 0a  dex. But before.
1cd00 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73        ** doing s
1cd10 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69  o, code a Noop i
1cd20 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73  nstruction and s
1cd30 74 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73  tore its address
1cd40 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 49 6e   in .      ** In
1cd50 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1cd60 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1cd70 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1cd80 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1cd90 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45     ** PRIMARY KE
1cda0 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  Y and the table 
1cdb0 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49  is actually a WI
1cdc0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1cdd0 65 2e 20 49 6e 20 0a 20 20 20 20 20 20 2a 2a 20  e. In .      ** 
1cde0 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f  that case the co
1cdf0 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
1ce00 77 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  widTable() routi
1ce10 6e 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a  ne will replace.
1ce20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f        ** the Noo
1ce30 70 20 77 69 74 68 20 61 20 47 6f 74 6f 20 74 6f  p with a Goto to
1ce40 20 6a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 56   jump over the V
1ce50 44 42 45 20 63 6f 64 65 20 67 65 6e 65 72 61 74  DBE code generat
1ce60 65 64 20 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20  ed below. */.   
1ce70 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
1ce80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ce90 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(v, OP_Noop);
1cea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ceb0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
1cec0 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
1ced0 20 69 4d 65 6d 2c 20 42 54 52 45 45 5f 42 4c 4f   iMem, BTREE_BLO
1cee0 42 4b 45 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  BKEY);..      /*
1cef0 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
1cf00 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
1cf10 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1cf20 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
1cf30 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
1cf40 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a  variable.      *
1cf50 2f 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  /.      if( pSta
1cf60 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rt ){.        in
1cf70 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  t n = (int)(pPar
1cf80 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
1cf90 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70   - pName->z) + p
1cfa0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1cfb0 6e 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  n.n;.        if(
1cfc0 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
1cfd0 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
1cfe0 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e     /* A named in
1cff0 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c  dex with an expl
1d000 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44 45  icit CREATE INDE
1d010 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  X statement */. 
1d020 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73         zStmt = s
1d030 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1d040 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
1d050 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
1d060 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
1d070 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
1d080 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65  NIQUE", n, pName
1d090 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->z);.      }els
1d0a0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  e{.        /* An
1d0b0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
1d0c0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
1d0d0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1d0e0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
1d0f0 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74  /.        /* zSt
1d100 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1d110 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
1d120 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
1d130 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1d140 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
1d150 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
1d160 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
1d170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1d180 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1d190 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1d1a0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1d1b0 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1d1c0 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1d1d0 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20  Q);",.          
1d1e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
1d1f0 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
1d200 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49  ME,.          pI
1d210 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1d220 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1d230 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 69 4d  me,.          iM
1d240 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53  em,.          zS
1d250 74 6d 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  tmt.          );
1d260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1d270 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b  Free(db, zStmt);
1d280 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20  ..      /* Fill 
1d290 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1d2a0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1d2b0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1d2c0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1d2d0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1d2e0 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1d2f0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1d300 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d310 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b   if( pTblName ){
1d320 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d330 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1d340 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1d350 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1d360 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1d370 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1d380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d390 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1d3a0 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20  (v, iDb,.       
1d3b0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1d3c0 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1d3d0 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1d3e0 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1d3f0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ame));.        s
1d400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1d410 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30  (v, OP_Expire, 0
1d420 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
1d430 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1d440 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 64  JumpHere(v, pInd
1d450 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20 7d  ex->tnum);.    }
1d460 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1d470 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1d480 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1d490 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1d4a0 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1d4b0 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1d4c0 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1d4d0 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1d4e0 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1d4f0 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1d500 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1d510 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1d520 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1d530 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1d540 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1d550 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1d560 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1d570 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1d580 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1d590 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1d5a0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1d5b0 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1d5c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1d5d0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1d5e0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1d5f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1d600 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1d610 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1d620 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1d630 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1d640 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1d650 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1d660 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1d670 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1d680 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1d690 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1d6a0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1d6b0 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1d6c0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1d6d0 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1d6e0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1d6f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1d700 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1d710 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1d720 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1d730 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1d740 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1d750 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65  dex = 0;.  }.  e
1d760 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d  lse if( IN_RENAM
1d770 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
1d780 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1d790 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  pNewIndex==0 );.
1d7a0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
1d7b0 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a  Index = pIndex;.
1d7c0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1d7d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
1d7e0 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e  up before exitin
1d7f0 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65  g */.exit_create
1d800 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49  _index:.  if( pI
1d810 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46 72  ndex ) sqlite3Fr
1d820 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
1d830 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ex);.  sqlite3Ex
1d840 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49  prDelete(db, pPI
1d850 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
1d860 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1d870 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
1d880 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d890 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
1d8a0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d8b0 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  e(db, zName);.}.
1d8c0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1d8d0 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1d8e0 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1d8f0 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1d900 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1d910 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1d920 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1d930 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1d940 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1d950 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1d960 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  sed to contain t
1d970 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1d980 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64  ments in the ind
1d990 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20  ex..** Since we 
1d9a0 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65  do not know, gue
1d9b0 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61  ss 1 million.  a
1d9c0 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e  iRowEst[1] is an
1d9d0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1d9e0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  .** number of ro
1d9f0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
1da00 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1da10 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20  articular value 
1da20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  of the.** first 
1da30 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
1da40 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32  dex.  aiRowEst[2
1da50 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1da60 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   of the number.*
1da70 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d  * of rows that m
1da80 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1da90 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lar combination 
1daa0 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1dab0 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1dac0 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1dad0 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1dae0 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1daf0 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1db00 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1db10 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1db20 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1db30 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1db40 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1db50 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1db60 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1db70 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1db80 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1db90 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1dba0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1dbb0 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1dbc0 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1dbd0 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1dbe0 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1dbf0 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1dc00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dc10 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1dc20 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f  ndex *pIdx){.  /
1dc30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1dc40 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c   10,  9,  8,  7,
1dc50 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20    6 */.  LogEst 
1dc60 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33  aVal[] = { 33, 3
1dc70 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b  2, 30, 28, 26 };
1dc80 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70  .  LogEst *a = p
1dc90 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  Idx->aiRowLogEst
1dca0 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20  ;.  int nCopy = 
1dcb0 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61 56  MIN(ArraySize(aV
1dcc0 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  al), pIdx->nKeyC
1dcd0 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ol);.  int i;.. 
1dce0 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74 68   /* Indexes with
1dcf0 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73 74   default row est
1dd00 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e 6f  imates should no
1dd10 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61 74  t have stat1 dat
1dd20 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  a */.  assert( !
1dd30 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20 29  pIdx->hasStat1 )
1dd40 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1dd50 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d  first entry (num
1dd60 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1dd70 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65  he index) to the
1dd80 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a   estimated .  **
1dd90 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1dda0 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f 72  in the table, or
1ddb0 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65 72   half the number
1ddc0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1ddd0 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20 61  table.  ** for a
1dde0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 20   partial index. 
1ddf0 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65 74    But do not let
1de00 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64 72   the estimate dr
1de10 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f 0a  op below 10. */.
1de20 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70    a[0] = pIdx->p
1de30 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
1de40 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  t;.  if( pIdx->p
1de50 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
1de60 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20 61  ) a[0] -= 10;  a
1de70 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
1de80 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
1de90 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20 61   if( a[0]<33 ) a
1dea0 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20 20  [0] = 33;       
1deb0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1dec0 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 33==sqlite3Lo
1ded0 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f  gEst(10) );..  /
1dee0 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20  * Estimate that 
1def0 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d  a[1] is 10, a[2]
1df00 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38   is 9, a[3] is 8
1df10 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35  , a[4] is 7, a[5
1df20 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20  ] is.  ** 6 and 
1df30 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1df40 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69  value (if any) i
1df50 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  s 5.  */.  memcp
1df60 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e  y(&a[1], aVal, n
1df70 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45  Copy*sizeof(LogE
1df80 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  st));.  for(i=nC
1df90 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  opy+1; i<=pIdx->
1dfa0 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1dfb0 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20     a[i] = 23;   
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c   assert( 23==sql
1dfe0 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b  ite3LogEst(5) );
1dff0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e000 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1e010 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55  (1) );.  if( IsU
1e020 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
1e030 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43   ) a[pIdx->nKeyC
1e040 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ol] = 0;.}../*.*
1e050 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
1e060 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73  ill drop an exis
1e070 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78  ting named index
1e080 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1e090 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ** implements th
1e0a0 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61  e DROP INDEX sta
1e0b0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
1e0c0 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
1e0d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e0e0 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
1e0f0 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20  int ifExists){. 
1e100 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
1e110 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
1e120 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1e130 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
1e140 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e150 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
1e160 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
1e170 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72  d with prior err
1e180 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ors */.  if( db-
1e190 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1e1a0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1e1b0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1e1c0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
1e1d0 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
1e1e0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1e1f0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1e200 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
1e210 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e220 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  x;.  }.  pIndex 
1e230 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1e240 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b  ex(db, pName->a[
1e250 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  0].zName, pName-
1e260 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
1e270 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d  ;.  if( pIndex==
1e280 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66  0 ){.    if( !if
1e290 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
1e2a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e2b0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1e2c0 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61   index: %S", pNa
1e2d0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  me, 0);.    }els
1e2e0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1e2f0 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53  CodeVerifyNamedS
1e300 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e  chema(pParse, pN
1e310 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
1e320 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase);.    }.    
1e330 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1e340 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74  ema = 1;.    got
1e350 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e360 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  x;.  }.  if( pIn
1e370 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51  dex->idxType!=SQ
1e380 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50  LITE_IDXTYPE_APP
1e390 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEF ){.    sqlit
1e3a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1e3b0 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
1e3c0 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
1e3d0 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
1e3e0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
1e3f0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
1e400 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
1e410 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1e420 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
1e430 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
1e440 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
1e450 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
1e460 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e470 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1e480 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
1e490 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
1e4a0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
1e4b0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
1e4c0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
1e4d0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1e4e0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1e4f0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1e500 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
1e510 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1e520 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e530 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e540 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
1e550 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
1e560 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1e570 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1e580 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1e590 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
1e5a0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1e5b0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
1e5c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e5d0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
1e5e0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
1e5f0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1e600 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1e610 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1e620 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1e630 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1e640 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
1e650 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
1e660 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
1e670 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
1e680 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1e690 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1e6a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1e6b0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1e6c0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1e6d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
1e6e0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1e6f0 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
1e700 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
1e710 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74  RE name=%Q AND t
1e720 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20  ype='index'",.  
1e730 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1e740 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1e750 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d  ER_NAME, pIndex-
1e760 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1e770 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
1e780 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
1e790 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e   iDb, "idx", pIn
1e7a0 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  dex->zName);.   
1e7b0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1e7c0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1e7d0 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
1e7e0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
1e7f0 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
1e800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e810 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
1e820 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
1e830 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
1e840 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
1e850 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
1e860 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1e870 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
1e880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
1e890 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1e8a0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
1e8b0 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63  ects. Each objec
1e8c0 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
1e8d0 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
1e8e0 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
1e8f0 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71   routine uses sq
1e900 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29  lite3DbRealloc()
1e910 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68  .** to extend th
1e920 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  e array so that 
1e930 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66  there is space f
1e940 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  or a new object 
1e950 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
1e960 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
1e970 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1e980 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e  *pnEntry contain
1e990 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  s the current si
1e9a0 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72  ze of.** the arr
1e9b0 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d  ay (in entries -
1e9c0 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   so the allocati
1e9d0 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79  on is ((*pnEntry
1e9e0 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74  ) * szEntry) byt
1e9f0 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e  es.** in total).
1ea00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1ea10 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65  alloc() is succe
1ea20 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e  ssful (i.e. if n
1ea30 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  o OOM condition 
1ea40 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20  occurs), the.** 
1ea50 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1ea60 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  for the new obje
1ea70 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70  ct is zeroed, *p
1ea80 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74  nEntry updated t
1ea90 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65  o.** reflect the
1eaa0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1eab0 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69   array and a poi
1eac0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1ead0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65  allocation.** re
1eae0 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73  turned. *pIdx is
1eaf0 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
1eb00 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72  x of the new arr
1eb10 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  ay entry in this
1eb20 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   case..**.** Oth
1eb30 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72  erwise, if the r
1eb40 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20  ealloc() fails, 
1eb50 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1eb60 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d  -1, *pnEntry rem
1eb70 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ains.** unchange
1eb80 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  d and a copy of 
1eb90 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e  pArray returned.
1eba0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
1ebb0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1ebc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1ebd0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1ebe0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1ebf0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1ec00 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
1ec10 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
1ec20 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
1ec30 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
1ec40 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
1ec50 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
1ec60 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
1ec70 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
1ec80 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
1ec90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1eca0 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
1ecb0 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
1ecc0 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  t *pIdx         
1ecd0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64  /* Write the ind
1ece0 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74  ex of a new slot
1ecf0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   here */.){.  ch
1ed00 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  ar *z;.  int n =
1ed10 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28   *pnEntry;.  if(
1ed20 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20   (n & (n-1))==0 
1ed30 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  ){.    int sz = 
1ed40 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1ed50 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1ed60 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1ed70 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1ed80 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1ed90 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1eda0 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1edb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1edc0 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1edd0 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1ede0 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1edf0 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1ee00 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1ee10 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1ee20 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b    *pIdx = n;.  +
1ee30 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
1ee40 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
1ee50 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1ee60 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1ee70 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
1ee80 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
1ee90 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1eea0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
1eeb0 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
1eec0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
1eed0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1eee0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
1eef0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72  IdListAppend(Par
1ef00 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
1ef10 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1ef20 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c   *pToken){.  sql
1ef30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1ef40 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
1ef50 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1ef60 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1ef70 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1ef80 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1ef90 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1efa0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1efb0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1efc0 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1efd0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1efe0 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1eff0 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1f000 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1f010 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1f020 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1f030 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1f040 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1f050 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1f060 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1f070 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1f080 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1f090 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1f0a0 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
1f0b0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1f0c0 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  ECT && pList->a[
1f0d0 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1f0e0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
1f0f0 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
1f100 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d  oid*)pList->a[i]
1f110 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  .zName, pToken);
1f120 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
1f130 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1f140 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1f150 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1f160 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1f170 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1f180 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1f190 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1f1a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1f1b0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1f1c0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1f1d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f1e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1f1f0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1f200 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1f210 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1f220 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
1f230 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1f240 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1f250 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1f260 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1f270 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1f280 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1f290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1f2a0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1f2b0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1f2c0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1f2d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1f2e0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1f2f0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1f300 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1f310 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1f320 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1f330 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1f340 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1f350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1f360 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
1f370 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1f380 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1f390 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1f3a0 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1f3b0 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1f3c0 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1f3d0 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1f3e0 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1f3f0 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1f400 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1f410 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1f420 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1f430 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1f440 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1f450 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1f460 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1f470 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1f480 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1f490 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1f4a0 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1f4b0 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1f4c0 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1f4d0 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1f4e0 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1f4f0 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1f500 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1f510 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1f520 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1f530 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1f540 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1f550 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1f560 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1f570 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1f580 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1f590 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1f5a0 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1f5b0 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1f5c0 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1f5d0 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1f5e0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1f5f0 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
1f600 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
1f610 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
1f620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
1f630 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
1f640 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
1f650 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1f660 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
1f670 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
1f680 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1f690 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1f6a0 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
1f6b0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1f6c0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1f6d0 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1f6e0 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1f6f0 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1f700 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1f710 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1f720 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1f730 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1f740 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1f750 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1f760 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1f770 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1f780 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1f790 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1f7a0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1f7b0 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1f7c0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1f7d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1f7e0 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1f7f0 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1f800 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1f810 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1f820 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1f830 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1f840 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1f850 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1f860 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1f870 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
1f880 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
1f890 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  *2+nExtra;.    i
1f8a0 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
1f8b0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1f8c0 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1f8e0 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1f8f0 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1f900 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1f910 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1f920 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f940 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1f950 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
1f960 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
1f970 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
1f980 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
1f990 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
1f9a0 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
1f9b0 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
1f9c0 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
1f9d0 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  = nGot;.  }..  /
1f9e0 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1f9f0 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1fa00 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1fa10 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1fa20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1fa30 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1fa40 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1fa50 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1fa60 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1fa70 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1fa80 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1fa90 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
1faa0 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
1fab0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
1fac0 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
1fad0 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
1fae0 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
1faf0 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
1fb00 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
1fb10 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
1fb20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
1fb30 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
1fb40 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
1fb50 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1fb60 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
1fb70 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
1fb80 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
1fb90 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
1fba0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
1fbb0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
1fbc0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
1fbd0 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
1fbe0 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
1fbf0 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
1fc00 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
1fc10 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
1fc20 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
1fc30 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1fc40 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
1fc50 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
1fc60 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
1fc70 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
1fc80 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1fc90 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1fca0 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
1fcb0 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
1fcc0 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
1fcd0 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
1fce0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1fcf0 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
1fd00 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
1fd10 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
1fd20 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
1fd30 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
1fd40 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
1fd50 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
1fd60 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1fd70 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
1fd80 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
1fd90 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
1fda0 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
1fdb0 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
1fdc0 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
1fdd0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
1fde0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1fdf0 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
1fe00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
1fe10 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
1fe20 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
1fe30 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
1fe40 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
1fe50 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
1fe60 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
1fe70 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
1fe80 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
1fe90 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
1fea0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
1feb0 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
1fec0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1fed0 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
1fee0 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
1fef0 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
1ff00 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
1ff10 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
1ff20 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
1ff30 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ff40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ff50 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1ff60 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
1ff70 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
1ff80 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1ff90 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
1ffa0 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
1ffb0 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
1ffc0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1ffd0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ffe0 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
1fff0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
20000 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
20010 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
20020 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
20030 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
20040 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
20050 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
20060 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
20070 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
20080 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20090 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
200a0 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
200b0 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
200c0 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
200d0 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
200e0 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
200f0 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
20100 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
20110 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
20120 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
20130 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
20140 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
20150 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
20160 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
20170 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
20180 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
20190 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
201a0 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
201b0 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
201c0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
201d0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
201e0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
201f0 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
20200 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
20210 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
20220 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
20230 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
20240 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
20250 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
20260 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
20270 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
20280 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
20290 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  B */.  assert( d
202a0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
202b0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
202c0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
202d0 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
202e0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
202f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
20300 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
20310 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
20320 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 1;.    pList-
20330 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d  >nSrc = 1;.    m
20340 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
20350 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  0], 0, sizeof(pL
20360 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
20370 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75   pList->a[0].iCu
20380 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  rsor = -1;.  }el
20390 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  se{.    pList = 
203a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
203b0 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
203c0 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
203d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
203e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
203f0 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
20400 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
20410 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
20420 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
20430 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
20440 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
20450 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
20460 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
20470 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
20480 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
20490 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70  atabase ){.    p
204a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
204b0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
204c0 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
204d0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
204e0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
204f0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
20500 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  b, pTable);.  }e
20510 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lse{.    pItem->
20520 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
20530 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
20540 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49   pTable);.    pI
20550 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
20560 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20570 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
20580 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
20590 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
205a0 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
205b0 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
205c0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
205d0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
205e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
205f0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
20600 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
20610 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20620 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
20630 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
20640 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20650 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
20660 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
20670 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
20680 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
20690 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
206a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
206b0 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
206c0 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
206d0 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
206e0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
206f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
20700 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
20710 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
20720 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
20730 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
20740 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
20750 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
20760 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
20770 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
20780 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
20790 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
207a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
207b0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
207c0 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
207d0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
207e0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
207f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
20800 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
20810 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
20820 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
20830 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
20840 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
20850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
20860 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
20870 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
20880 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20890 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
208a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
208b0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
208c0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
208d0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
208e0 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46  dBy ) sqlite3DbF
208f0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ree(db, pItem->u
20900 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
20910 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
20920 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c  .isTabFunc ) sql
20930 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
20940 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  te(db, pItem->u1
20950 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20  .pFuncArg);.    
20960 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
20970 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54  le(db, pItem->pT
20980 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
20990 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
209a0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
209b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
209c0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
209d0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
209e0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
209f0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
20a00 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
20a10 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
20a20 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
20a30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
20a40 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
20a50 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
20a60 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
20a70 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
20a80 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
20a90 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
20aa0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
20ab0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
20ac0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
20ad0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
20ae0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
20af0 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
20b00 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
20b10 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
20b20 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
20b30 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
20b40 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
20b50 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
20b60 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
20b70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
20b80 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
20b90 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
20ba0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
20bb0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
20bc0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
20bd0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
20be0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
20bf0 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
20c00 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
20c10 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
20c20 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
20c30 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
20c40 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
20c50 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
20c60 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
20c70 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
20c80 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
20c90 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
20ca0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
20cb0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
20cc0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
20cd0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
20ce0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
20cf0 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
20d00 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
20d10 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
20d20 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
20d30 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
20d40 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
20d50 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
20d60 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
20d70 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
20d80 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
20d90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
20da0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20db0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
20dc0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
20dd0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
20de0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
20df0 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
20e00 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
20e10 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
20e20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
20e30 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
20e40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20e50 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
20e60 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
20e70 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
20e80 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
20e90 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
20ea0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
20eb0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
20ec0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
20ed0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
20ee0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
20ef0 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
20f00 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
20f10 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
20f20 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
20f30 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
20f40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20f50 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
20f60 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
20f70 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
20f80 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
20f90 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
20fa0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
20fb0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
20fc0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
20fd0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20fe0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
20ff0 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
21000 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21010 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
21020 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
21030 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
21040 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
21050 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
21060 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
21070 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
21080 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
21090 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
210a0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
210b0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
210c0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( p==0 ){.    go
210d0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
210e0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
210f0 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b  rt( p->nSrc>0 );
21100 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
21110 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61  [p->nSrc-1];.  a
21120 73 73 65 72 74 28 20 28 70 54 61 62 6c 65 3d 3d  ssert( (pTable==
21130 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65 3d 3d  0)==(pDatabase==
21140 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
21150 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
21160 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d 30 20  || pDatabase!=0 
21170 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  );.  if( IN_RENA
21180 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74  ME_OBJECT && pIt
21190 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
211a0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d   Token *pToken =
211b0 20 28 41 4c 57 41 59 53 28 70 44 61 74 61 62 61   (ALWAYS(pDataba
211c0 73 65 29 20 26 26 20 70 44 61 74 61 62 61 73 65  se) && pDatabase
211d0 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61 73 65  ->z) ? pDatabase
211e0 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 73   : pTable;.    s
211f0 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
21200 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70 49 74  nMap(pParse, pIt
21210 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65  em->zName, pToke
21220 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
21230 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
21240 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
21250 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
21260 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
21270 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
21280 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
21290 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
212a0 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
212b0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
212c0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
212d0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
212e0 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
212f0 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
21300 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
21310 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
21320 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
21330 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
21340 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
21350 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
21360 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
21370 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
21380 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
21390 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
213a0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
213b0 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
213c0 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
213d0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
213e0 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
213f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
21400 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
21410 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
21420 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
21430 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
21440 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
21450 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
21460 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
21470 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 49 6e  ;.  if( p && pIn
21480 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a  dexedBy->n>0 ){.
21490 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
214a0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
214b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
214c0 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  Src>0 );.    pIt
214d0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
214e0 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
214f0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
21500 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
21510 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21520 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
21530 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21540 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
21550 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
21560 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e  if( pIndexedBy->
21570 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65  n==1 && !pIndexe
21580 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  dBy->z ){.      
21590 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45  /* A "NOT INDEXE
215a0 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75  D" clause was su
215b0 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73  pplied. See pars
215c0 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e.y .      ** co
215d0 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64  nstruct "indexed
215e0 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c  _opt" for detail
215f0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  s. */.      pIte
21600 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
21610 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
21620 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  .      pItem->u1
21630 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
21640 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
21650 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
21660 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
21670 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e    pItem->fg.isIn
21680 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20  dexedBy = 1;.   
21690 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
216a0 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  Add the list of 
216b0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
216c0 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ts to the SrcLis
216d0 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a  t entry for a.**
216e0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75   table-valued-fu
216f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
21700 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75  sqlite3SrcListFu
21710 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50  ncArgs(Parse *pP
21720 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
21730 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
21740 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
21750 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21760 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
21770 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
21780 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
21790 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
217a0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
217b0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
217c0 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
217d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
217e0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
217f0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
21800 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
21810 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d  pList;.    pItem
21820 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d  ->fg.isTabFunc =
21830 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
21840 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21850 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
21860 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  b, pList);.  }.}
21870 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69  ../*.** When bui
21880 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20  lding up a FROM 
21890 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61  clause in the pa
218a0 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f  rser, the join o
218b0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  perator.** is in
218c0 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64  itially attached
218d0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65   to the left ope
218e0 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63  rand.  But the c
218f0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
21900 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69   expects the joi
21910 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  n operator to be
21920 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70   on the right op
21930 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75  erand.  This rou
21940 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61  tine.** Shifts a
21950 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  ll join operator
21960 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  s from left to r
21970 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69  ight for an enti
21980 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73  re FROM.** claus
21990 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  e..**.** Example
219a0 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f  : Suppose the jo
219b0 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  in is like this:
219c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
219d0 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73   A natural cross
219e0 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68   join B.**.** Th
219f0 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e  e operator is "n
21a00 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
21a10 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42  n".  The A and B
21a20 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74   operands are st
21a30 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b  ored.** in p->a[
21a40 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20  0] and p->a[1], 
21a50 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
21a60 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61  he parser initia
21a70 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  lly stores the.*
21a80 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  * operator with 
21a90 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  A.  This routine
21aa0 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65   shifts that ope
21ab0 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e  rator over to B.
21ac0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21ad0 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
21ae0 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29  Type(SrcList *p)
21af0 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
21b00 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
21b10 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
21b20 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
21b30 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[i].fg.jointyp
21b40 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67  e = p->a[i-1].fg
21b50 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
21b60 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e  .    p->a[0].fg.
21b70 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
21b80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
21b90 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
21ba0 72 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  r a BEGIN statem
21bb0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
21bc0 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
21bd0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
21be0 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
21bf0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21c00 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
21c10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
21c20 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
21c30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
21c40 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
21c50 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
21c60 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
21c70 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
21c80 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
21c90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
21ca0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
21cb0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
21cc0 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
21cd0 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
21ce0 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
21cf0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21d00 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
21d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
21d30 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
21d40 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
21d50 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
21d60 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
21d70 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
21d80 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
21d90 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp0(v, OP_Auto
21da0 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Commit);.}../*.*
21db0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
21dc0 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49  code for a COMMI
21dd0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74  T or ROLLBACK st
21de0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65  atement..** Code
21df0 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73   for ROLLBACK is
21e00 20 67 65 6e 65 72 61 74 65 64 20 69 66 20 65 54   generated if eT
21e10 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b  ype==TK_ROLLBACK
21e20 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
21e30 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
21e40 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a  d for a COMMIT..
21e50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
21e60 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ndTransaction(Pa
21e70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21e80 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20   eType){.  Vdbe 
21e90 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c  *v;.  int isRoll
21ea0 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  back;..  assert(
21eb0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
21ec0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
21ed0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
21ee0 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d  t( eType==TK_COM
21ef0 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  MIT || eType==TK
21f00 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54  _END || eType==T
21f10 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  K_ROLLBACK );.  
21f20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79  isRollback = eTy
21f30 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b  pe==TK_ROLLBACK;
21f40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
21f50 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
21f60 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
21f70 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f  ON, .       isRo
21f80 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41  llback ? "ROLLBA
21f90 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20  CK" : "COMMIT", 
21fa0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
21fb0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
21fc0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
21fd0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
21fe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
21ff0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
22000 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52  toCommit, 1, isR
22010 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a  ollback);.  }.}.
22020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22030 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
22040 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
22050 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f  n it parses a co
22060 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c  mmand to create,
22070 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72  .** release or r
22080 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73  ollback an SQL s
22090 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f  avepoint. .*/.vo
220a0 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  id sqlite3Savepo
220b0 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
220c0 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e  e, int op, Token
220d0 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
220e0 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
220f0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
22100 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
22110 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
22120 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
22130 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
22140 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
22150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
22160 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74  ORIZATION.    st
22170 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
22180 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b  * const az[] = {
22190 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
221a0 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
221b0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
221c0 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
221d0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
221e0 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
221f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
22200 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
22210 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
22220 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
22230 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
22240 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
22250 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
22260 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
22270 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
22280 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
22290 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
222a0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
222b0 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
222c0 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
222d0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
222e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
222f0 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
22300 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
22310 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
22320 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
22330 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
22340 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
22350 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
22360 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
22370 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
22380 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
22390 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
223a0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
223b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
223c0 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
223d0 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
223e0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
223f0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
22400 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20  Btree *pBt;.    
22410 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
22420 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
22430 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22440 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
22450 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22460 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
22470 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22480 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
22490 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
224a0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
224b0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
224c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
224d0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
224e0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
224f0 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70  >pVfs, 0, db, &p
22500 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20  Bt, 0, flags);. 
22510 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22530 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22540 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
22550 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
22560 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
22570 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
22580 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
22590 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
225a0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
225b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
225c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
225d0 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74  aDb[1].pBt = pBt
225e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
225f0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
22600 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
22610 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
22620 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
22630 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
22640 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20  agesize, -1, 0) 
22650 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22660 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
22670 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22680 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22690 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   0;.}../*.** Rec
226a0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
226b0 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
226c0 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  kie will need to
226d0 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20   be verified.** 
226e0 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
226f0 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61  .  The code to a
22700 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74  ctually verify t
22710 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
22720 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61  .** will occur a
22730 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22740 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20   top-level VDBE 
22750 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  and will be gene
22760 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20  rated.** later, 
22770 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  by sqlite3Finish
22780 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69  Coding()..*/.voi
22790 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
227a0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
227b0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
227c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
227d0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
227e0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
227f0 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  rse);..  assert(
22800 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
22810 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
22820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
22830 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
22840 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
22850 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
22860 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
22870 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73  TACHED+2 );.  as
22880 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
22890 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61  emaMutexHeld(pPa
228a0 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29  rse->db, iDb, 0)
228b0 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
228c0 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
228d0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
228e0 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
228f0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
22900 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
22910 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
22920 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
22930 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22940 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
22950 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
22960 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22970 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
22980 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
22990 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
229a0 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
229b0 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
229c0 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
229d0 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
229e0 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
229f0 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
22a00 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
22a10 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
22a20 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
22a30 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
22a40 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
22a50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22a60 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
22a70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
22a80 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
22a90 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
22aa0 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
22ab0 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
22ac0 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
22ad0 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
22ae0 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  DbSName)) ){.   
22af0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
22b00 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
22b10 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
22b20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22b30 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
22b40 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
22b50 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
22b60 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
22b70 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
22b80 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
22b90 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
22ba0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
22bb0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
22bc0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
22bd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
22be0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
22bf0 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
22c00 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
22c10 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
22c20 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
22c30 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
22c40 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
22c50 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
22c60 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
22c70 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
22c80 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
22c90 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
22ca0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
22cb0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
22cc0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
22cd0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
22ce0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
22cf0 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
22d00 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
22d10 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
22d20 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
22d30 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
22d40 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
22d50 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
22d60 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
22d70 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
22d80 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
22d90 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
22da0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
22db0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
22dc0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
22dd0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
22de0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
22df0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22e00 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
22e10 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
22e20 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
22e30 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
22e40 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
22e50 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
22e60 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
22e70 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
22e80 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
22e90 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
22ea0 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
22eb0 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
22ec0 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
22ed0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
22ee0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
22ef0 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
22f00 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
22f10 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
22f20 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
22f30 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
22f40 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
22f50 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
22f60 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
22f70 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
22f80 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
22f90 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
22fa0 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
22fb0 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
22fc0 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
22fd0 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
22fe0 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
22ff0 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
23000 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
23010 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
23020 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
23030 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
23040 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
23050 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
23060 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
23070 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
23080 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
23090 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
230a0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
230b0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
230c0 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
230d0 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
230e0 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
230f0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
23100 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
23110 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
23120 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
23130 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
23140 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
23150 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
23160 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
23170 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
23180 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
23190 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
231a0 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
231b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
231c0 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
231d0 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
231e0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
231f0 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
23200 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
23210 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
23220 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
23230 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
23240 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
23250 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
23260 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
23270 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
23280 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
23290 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
232a0 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
232b0 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
232c0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
232d0 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
232e0 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
232f0 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
23300 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
23310 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
23320 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
23330 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
23340 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
23350 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
23360 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
23370 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
23380 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
23390 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
233a0 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
233b0 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
233c0 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
233d0 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
233e0 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
233f0 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
23400 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
23410 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
23420 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23430 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23440 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23450 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23460 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
23470 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
23480 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
23490 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
234a0 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
234b0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
234c0 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
234d0 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
234e0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
234f0 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
23500 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
23510 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
23520 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
23530 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
23540 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
23550 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
23560 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23570 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
23580 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
23590 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
235a0 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
235b0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
235c0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
235d0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
235e0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
235f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
23600 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
23610 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
23620 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
23630 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
23640 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
23650 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
23660 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
23670 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
23680 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
23690 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
236a0 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
236b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
236c0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
236d0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
236e0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
236f0 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
23700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
23710 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
23720 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
23730 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
23740 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23750 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29  eP5(v, p5Errmsg)
23760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
23770 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
23780 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
23790 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
237a0 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f  nt violation..*/
237b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
237c0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  queConstraint(. 
237d0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
237e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
237f0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
23800 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
23810 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
23820 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
23830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
23840 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72  dex that trigger
23850 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
23860 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
23870 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Err;.  int j;.  
23880 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b  StrAccum errMsg;
23890 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
238a0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a   pIdx->pTable;..
238b0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
238c0 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70  mInit(&errMsg, p
238d0 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c  Parse->db, 0, 0,
238e0 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64   200);.  if( pId
238f0 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
23900 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
23910 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20  ppendf(&errMsg, 
23920 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
23930 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
23940 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
23950 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
23960 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
23970 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
23980 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
23990 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
239a0 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
239b0 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
239c0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
239d0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
239e0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
239f0 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
23a00 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
23a10 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
23a20 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62  ll(&errMsg, pTab
23a30 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23a40 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
23a50 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
23a60 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
23a70 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
23a80 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b  (&errMsg, zCol);
23a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72  .    }.  }.  zEr
23aa0 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
23ab0 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
23ac0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
23ad0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
23ae0 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
23af0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
23b00 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
23b10 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
23b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
23b40 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23b50 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
23b60 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
23b70 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
23b80 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
23b90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
23ba0 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
23bb0 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
23bc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23bd0 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
23be0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23bf0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23c00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
23c10 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
23c20 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
23c30 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
23c40 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
23c60 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
23c70 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
23c80 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
23c90 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
23ca0 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
23cb0 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
23cc0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
23cd0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
23ce0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
23cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d00 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
23d10 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
23d20 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
23d30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
23d40 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
23d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
23d60 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
23d70 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
23d80 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
23d90 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
23da0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
23db0 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
23dc0 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
23dd0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
23de0 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
23df0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
23e20 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
23e30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
23e40 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
23e50 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
23e60 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
23e70 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
23e80 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
23e90 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
23ea0 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
23eb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
23ec0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
23ed0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
23ee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
23ef0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
23f00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
23f10 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
23f20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
23f30 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
23f40 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
23f50 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
23f60 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
23f70 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
23f80 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
23f90 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
23fa0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
23fb0 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
23fc0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
23fd0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
23fe0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23ff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
24000 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24010 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
24020 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
24030 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
24040 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
24050 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
24060 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
24070 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
24080 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
24090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
240a0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
240b0 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
240c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
240d0 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
240e0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
240f0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24110 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
24120 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
24130 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
24140 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
24150 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
24160 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
24170 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
24180 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
24190 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
241a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
241b0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
241c0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
241d0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
241e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
241f0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
24200 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
24210 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
24220 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
24230 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
24240 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
24250 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
24260 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
24270 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
24280 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
24290 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
242a0 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
242b0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
242c0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
242d0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
242e0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
242f0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
24300 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24310 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
24320 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
24330 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
24340 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
24350 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
24360 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24380 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
24390 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
243c0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
243d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
243e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
243f0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
24400 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
24410 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24430 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
24440 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
24450 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
24480 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
24490 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
244a0 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
244b0 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
244c0 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
244d0 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
244e0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
244f0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
24500 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
24510 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
24520 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
24530 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
24540 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
24550 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
24560 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
24570 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
24580 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
24590 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
245a0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
245b0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
245c0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
245d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
245e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
245f0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
24600 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
24610 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
24640 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
24650 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
24660 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
24670 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
24680 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
24690 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
246a0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
246b0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
246c0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
246d0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
246e0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
246f0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
24700 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
24710 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
24720 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
24730 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
24740 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
24750 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
24760 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
24770 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
24780 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
24790 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
247a0 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
247b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
247c0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
247d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
247e0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
247f0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
24800 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
24810 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
24820 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
24830 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
24840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24850 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
24860 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
24870 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
24880 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248a0 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
248b0 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
248c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
248d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
248e0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
248f0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
24900 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
24910 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
24920 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
24930 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
24940 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
24950 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
24960 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
24970 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
249a0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
249b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
249c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
249d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
249e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
249f0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
24a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24a10 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
24a20 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
24a30 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
24a40 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
24a50 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
24a60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
24a70 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
24a80 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
24a90 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
24aa0 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
24ab0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
24ac0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
24ad0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
24ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
24af0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
24b00 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
24b10 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
24b20 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
24b30 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
24b40 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
24b50 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
24b60 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
24b70 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
24b80 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
24b90 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
24ba0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
24bb0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
24bc0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
24bd0 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
24be0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
24bf0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
24c00 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
24c10 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
24c20 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
24c30 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
24c40 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
24c50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24c60 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
24c70 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
24c80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24c90 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
24ca0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
24cb0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
24cc0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
24cd0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
24ce0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
24cf0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
24d00 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
24d10 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
24d20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
24d30 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
24d40 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
24d50 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
24d60 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
24d70 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
24d80 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
24d90 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
24da0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
24db0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
24dc0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
24dd0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
24de0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
24df0 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
24e00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24e10 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
24e20 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
24e30 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
24e40 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
24e50 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
24e60 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
24e70 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
24e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24e90 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
24ea0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
24eb0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
24ec0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
24ed0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
24ee0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24ef0 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
24f00 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
24f10 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
24f20 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
24f30 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  x..**.** The cal
24f40 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  ler should invok
24f50 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  e sqlite3KeyInfo
24f60 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72  Unref() on the r
24f70 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a  eturned object.*
24f80 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69  * when it has fi
24f90 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e  nished using it.
24fa0 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
24fb0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
24fc0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
24fd0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
24fe0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
24ff0 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
25000 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  umn;.  int nKey 
25010 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
25020 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
25030 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
25040 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
25050 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69  .  if( pIdx->uni
25060 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
25070 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
25080 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
25090 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
250a0 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  l-nKey);.  }else
250b0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
250c0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
250d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
250e0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
250f0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
25100 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
25110 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
25120 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Key) );.    for(
25130 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
25140 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
25150 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
25160 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
25170 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
25180 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69  i] = zColl==sqli
25190 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30  te3StrBINARY ? 0
251a0 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
251b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
251c0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
251d0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
251e0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
251f0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
25200 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
25210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25220 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
25230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
25240 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
25250 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f  ERROR_MISSING_CO
25260 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69  LLSEQ );.      i
25270 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72  f( pIdx->bNoQuer
25280 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
25290 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20 74 68  /* Deactivate th
252a0 65 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  e index because 
252b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75  it contains an u
252c0 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67  nknown collating
252d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75  .        ** sequ
252e0 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ence.  The only 
252f0 77 61 79 20 74 6f 20 72 65 61 63 74 69 76 65 20  way to reactive 
25300 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20  the index is to 
25310 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20  reload the.     
25320 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41     ** schema.  A
25330 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e  dding the missin
25340 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  g collating sequ
25350 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20  ence later does 
25360 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  not.        ** r
25370 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
25380 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74  x.  The applicat
25390 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e  ion had the chan
253a0 63 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20  ce to register. 
253b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69         ** the mi
253c0 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e  ssing index usin
253d0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  g the collation-
253e0 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e  needed callback.
253f0 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a    For.        **
25400 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c   simplicity, SQL
25410 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76  ite will not giv
25420 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
25430 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63  n a second chanc
25440 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
25450 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51        pIdx->bNoQ
25460 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
25470 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
25480 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52  QLITE_ERROR_RETR
25490 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
254a0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
254b0 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
254c0 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
254d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
254e0 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
254f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
25500 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
25510 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
25520 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
25530 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
25540 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
25550 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
25560 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
25570 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
25580 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
25590 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
255a0 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
255b0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
255c0 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
255d0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
255e0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
255f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
25600 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
25610 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
25620 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
25630 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
25640 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
25650 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
25660 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
25670 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
25680 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
25690 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
256a0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
256b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
256c0 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
256d0 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
256e0 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
256f0 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
25700 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
25710 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
25720 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
25730 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
25740 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
25750 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
25760 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
25770 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
25780 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
25790 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
257a0 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
257b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
257c0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
257d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
257e0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
257f0 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
25800 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
25810 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25820 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
25830 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
25840 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
25850 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
25860 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
25870 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
25880 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
25890 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
258a0 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
258b0 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
258c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
258d0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
258e0 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
258f0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
25900 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
25910 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
25920 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
25930 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
25940 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
25950 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25960 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
25970 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
25980 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
25990 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
259a0 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
259b0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
259c0 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
259d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
259e0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
259f0 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
25a00 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
25a10 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
25a20 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
25a30 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25a40 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
25a50 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
25a60 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25a70 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
25a80 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
25a90 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
25aa0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
25ab0 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
25ac0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
25ad0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
25ae0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
25af0 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
25b00 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25b10 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
25b20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
25b30 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
25b40 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
25b50 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
25b60 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25b70 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
25b80 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
25b90 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
25ba0 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
25bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25bc0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
25bd0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
25be0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
25bf0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
25c00 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
25c10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25c20 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
25c30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25c40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25c50 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
25c60 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
25c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
25c80 20 2a 2f 0a                                       */.