/ Hex Artifact Content
Login

Artifact 82e919819295b32600e2c544bb2170c6fa2e237ec3c5f7a16e69f107391c110c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a  ErrMsg);.  if( z
2200: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71  ErrMsg ){.    sq
2210: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2220: 61 72 73 65 2c 20 22 25 7a 22 2c 20 7a 45 72 72  arse, "%z", zErr
2230: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
2240: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
2250: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41  ql);.  memcpy(PA
2260: 52 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29  RSE_TAIL(pParse)
2270: 2c 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  , saveBuf, PARSE
2280: 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61  _TAIL_SZ);.  pPa
2290: 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d  rse->nested--;.}
22a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
22b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
22c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
22d0: 55 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20  UE if zTable is 
22e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
22f0: 73 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61  system table tha
2300: 74 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  t stores the.** 
2310: 6c 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e  list of users an
2320: 64 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63  d their access c
2330: 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69  redentials..*/.i
2340: 6e 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75  nt sqlite3UserAu
2350: 74 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68  thTable(const ch
2360: 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72  ar *zTable){.  r
2370: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74  eturn sqlite3_st
2380: 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73  ricmp(zTable, "s
2390: 71 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b  qlite_user")==0;
23a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
23b0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
23c0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
23d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
23e0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
23f0: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2400: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2410: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2420: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2430: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2440: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2450: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2460: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
2470: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
2480: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
2490: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
24a0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
24b0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
24c0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
24d0: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
24e0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
24f0: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2500: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2510: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2520: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2530: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2540: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2550: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2560: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
2570: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
2580: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
2590: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
25a0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
25b0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
25c0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
25d0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
25e0: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
25f0: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2600: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2610: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
2620: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
2630: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
2640: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2650: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2660: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2670: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c  ( zDatabase!=0 |
2680: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
2690: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
26a0: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
26b0: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
26c0: 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  ION.  /* Only th
26d0: 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20  e admin user is 
26e0: 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20  allowed to know 
26f0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f  that the sqlite_
2700: 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  user table.  ** 
2710: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20  exists */.  if( 
2720: 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76  db->auth.authLev
2730: 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26  el<UAUTH_Admin &
2740: 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
2750: 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30  hTable(zName)!=0
2760: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2770: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  ;.  }.#endif.  w
2780: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72  hile(1){.    for
2790: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
27a0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
27b0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28  .      int j = (
27c0: 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20  i<2) ? i^1 : i; 
27d0: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
27e0: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
27f0: 20 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62        if( zDatab
2800: 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2810: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2820: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2830: 44 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  DbSName)==0 ){. 
2840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2850: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
2860: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
2870: 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73  );.        p = s
2880: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2890: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
28a0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
28b0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
28c0: 20 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20   p ) return p;. 
28d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28e0: 20 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20   /* Not found.  
28f0: 49 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77  If the name we w
2900: 65 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ere looking for 
2910: 77 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f  was temp.sqlite_
2920: 6d 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  master.    ** th
2930: 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61  en change the na
2940: 6d 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d  me to sqlite_tem
2950: 70 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79  p_master and try
2960: 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2970: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2980: 70 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  p(zName, MASTER_
2990: 4e 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b  NAME)!=0 ) break
29a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
29b0: 33 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62  3_stricmp(zDatab
29c0: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ase, db->aDb[1].
29d0: 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62  zDbSName)!=0 ) b
29e0: 72 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  reak;.    zName 
29f0: 3d 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41  = TEMP_MASTER_NA
2a00: 4d 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ME;.  }.  return
2a10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   0;.}../*.** Loc
2a20: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2a30: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
2a40: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
2a50: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
2a60: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2a70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2a80: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
2a90: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2aa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2ab0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2ac0: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2ad0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2ae0: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
2af0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
2b00: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2b10: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2b20: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2b30: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2b40: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
2b50: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
2b60: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
2b70: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
2b80: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2b90: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
2ba0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
2bb0: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
2bc0: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
2bd0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2be0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2bf0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e  ,         /* con
2c00: 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f  text in which to
2c10: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a   report errors *
2c20: 2f 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20  /.  u32 flags,  
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f             /* LO
2c40: 43 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43  CATE_VIEW or LOC
2c50: 41 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63  ATE_NOERR */.  c
2c60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2c70: 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
2c80: 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72   the table we ar
2c90: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f  e looking for */
2ca0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cb0: 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d  Dbase     /* Nam
2cc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2cd0: 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  e.  Might be NUL
2ce0: 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  L */.){.  Table 
2cf0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *p;.  sqlite3 *d
2d00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2d10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
2d20: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
2d30: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2d40: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2d50: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2d60: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2d70: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
2d80: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62  LL. */.  if( (db
2d90: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46  ->mDbFlags & DBF
2da0: 4c 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f  LAG_SchemaKnownO
2db0: 6b 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c  k)==0 .   && SQL
2dc0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
2dd0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
2de0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2df0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2e00: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2e10: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  (db, zName, zDba
2e20: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
2e30: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2e40: 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20  r *zMsg = flags 
2e50: 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f 20  & LOCATE_VIEW ? 
2e60: 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a  "no such view" :
2e70: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22   "no such table"
2e80: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2e90: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2ea0: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
2eb0: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
2ec0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
2ed0: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
2ee0: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
2ef0: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
2f00: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
2f10: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
2f20: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
2f30: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
2f40: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2f50: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2f60: 6c 65 2e 20 2a 2f 0a 20 20 20 20 4d 6f 64 75 6c  le. */.    Modul
2f70: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2f80: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2f90: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
2fa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
2fb0: 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69   pMod==0 && sqli
2fc0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61  te3_strnicmp(zNa
2fd0: 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37  me, "pragma_", 7
2fe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4d  )==0 ){.      pM
2ff0: 6f 64 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67  od = sqlite3Prag
3000: 6d 61 56 74 61 62 52 65 67 69 73 74 65 72 28 64  maVtabRegister(d
3010: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
3020: 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26 26  .    if( pMod &&
3030: 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e   sqlite3VtabEpon
3040: 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28 70  ymousTableInit(p
3050: 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a  Parse, pMod) ){.
3060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f        return pMo
3070: 64 2d 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20  d->pEpoTab;.    
3080: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
3090: 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45   (flags & LOCATE
30a0: 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20  _NOERR)==0 ){.  
30b0: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
30c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
30e0: 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a  , "%s: %s.%s", z
30f0: 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  Msg, zDbase, zNa
3100: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
3110: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3120: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3130: 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67  , "%s: %s", zMsg
3140: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
3150: 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  }.      pParse->
3160: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
3170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3180: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3190: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
31a0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
31b0: 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  *p..**.** This i
31c0: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
31d0: 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  nd sqlite3Locate
31e0: 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66  Table(). The dif
31f0: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a  ference between.
3200: 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  ** sqlite3Locate
3210: 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73  Table() and this
3220: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61   function is tha
3230: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
3240: 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65  restricts.** the
3250: 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d   search to schem
3260: 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69  a (p->pSchema) i
3270: 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
3280: 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79  . p->pSchema may
3290: 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20   be.** non-NULL 
32a0: 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66  if it is part of
32b0: 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67   a view or trigg
32c0: 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e  er program defin
32d0: 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71  ition. See.** sq
32e0: 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
32f0: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
3300: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
3310: 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
3320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3330: 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a  , .  u32 flags,.
3340: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3350: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3360: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3370: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 46 69   if( pParse->iFi
3380: 78 44 62 20 26 26 20 70 50 61 72 73 65 2d 3e 69  xDb && pParse->i
3390: 46 69 78 44 62 21 3d 32 20 29 7b 0a 20 20 20 20  FixDb!=2 ){.    
33a0: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
33b0: 2d 3e 61 44 62 5b 70 50 61 72 73 65 2d 3e 69 46  ->aDb[pParse->iF
33c0: 69 78 44 62 2d 31 5d 2e 7a 44 62 53 4e 61 6d 65  ixDb-1].zDbSName
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
33e0: 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c  >zDatabase==0 ||
33f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3400: 70 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 7a 44  p->zDatabase, zD
3410: 62 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  b)==0 );.    if(
3420: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3430: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 7a 44 61   ){.      p->zDa
3440: 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
3450: 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
3460: 3e 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 7d  >db, zDb);.    }
3470: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
3480: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69  pSchema ){.    i
3490: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
34a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
34b0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
34c0: 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d  hema);.    zDb =
34d0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
34e0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
34f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62    }else{.    zDb
3500: 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b   = p->zDatabase;
3510: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
3520: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
3530: 28 70 50 61 72 73 65 2c 20 66 6c 61 67 73 2c 20  (pParse, flags, 
3540: 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  p->zName, zDb);.
3550: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
3560: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
3570: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
3580: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
3590: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
35a0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
35b0: 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  that index.** an
35c0: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
35d0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
35e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
35f0: 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ex..** Return NU
3600: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
3610: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
3620: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
3630: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
3640: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
3650: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
3660: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64  rst matching ind
3670: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ex is returned. 
3680: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
3690: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69   for duplicate i
36a0: 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f  ndex names is do
36b0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
36c0: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
36d0: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
36e0: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
36f0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
3700: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
3710: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
3720: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
3730: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73  lite3FindIndex(s
3740: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
3750: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
3760: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
3770: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
3780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41  .  int i;.  /* A
3790: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
37a0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
37b0: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
37c0: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
37d0: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
37e0: 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74   zDb!=0 || sqlit
37f0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
3800: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
3810: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
3820: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
3830: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
3840: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
3850: 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50    /* Search TEMP
3860: 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a   before MAIN */.
3870: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
3880: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  ema = db->aDb[j]
3890: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  .pSchema;.    as
38a0: 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b  sert( pSchema );
38b0: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20  .    if( zDb && 
38c0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
38d0: 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  Db, db->aDb[j].z
38e0: 44 62 53 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  DbSName) ) conti
38f0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3900: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3910: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3920: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3930: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3940: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3950: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
3960: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
3970: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
3980: 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20  .** Reclaim the 
3990: 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61  memory used by a
39a0: 6e 20 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20  n index.*/.void 
39b0: 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78  sqlite3FreeIndex
39c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e  (sqlite3 *db, In
39d0: 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66  dex *p){.#ifndef
39e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41   SQLITE_OMIT_ANA
39f0: 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65  LYZE.  sqlite3De
3a00: 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73  leteIndexSamples
3a10: 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  (db, p);.#endif.
3a20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3a30: 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  ete(db, p->pPart
3a40: 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  IdxWhere);.  sql
3a50: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3a60: 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78  te(db, p->aColEx
3a70: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  pr);.  sqlite3Db
3a80: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c  Free(db, p->zCol
3a90: 41 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  Aff);.  if( p->i
3aa0: 73 52 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74  sResized ) sqlit
3ab0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 28 76 6f  e3DbFree(db, (vo
3ac0: 69 64 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b  id *)p->azColl);
3ad0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3ae0: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
3af0: 54 41 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66  TAT4.  sqlite3_f
3b00: 72 65 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29  ree(p->aiRowEst)
3b10: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
3b20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
3b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  .}../*.** For th
3b40: 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a  e index called z
3b50: 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73  IdxName which is
3b60: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
3b70: 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75  tabase iDb,.** u
3b80: 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78  nlike that index
3b90: 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20   from its Table 
3ba0: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  then remove the 
3bb0: 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68  index from.** th
3bc0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
3bd0: 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  le and free all 
3be0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3bf0: 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
3c00: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a  with the index..
3c10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
3c20: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
3c30: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
3c40: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
3c50: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b  char *zIdxName){
3c60: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
3c70: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b  ;.  Hash *pHash;
3c80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
3c90: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
3ca0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
3cb0: 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d  ;.  pHash = &db-
3cc0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
3cd0: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49  a->idxHash;.  pI
3ce0: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61  ndex = sqlite3Ha
3cf0: 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
3d00: 7a 49 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zIdxName, 0);.  
3d10: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65  if( ALWAYS(pInde
3d20: 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  x) ){.    if( pI
3d30: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3d40: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3d50: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
3d60: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
3d70: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3d80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
3d90: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f  ndex *p;.      /
3da0: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
3db0: 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68  of ALWAYS();  Th
3dc0: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
3dd0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  on the list of. 
3de0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e       ** indices.
3df0: 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49   */.      p = pI
3e00: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3e10: 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
3e20: 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  e( ALWAYS(p) && 
3e30: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
3e40: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
3e50: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ; }.      if( AL
3e60: 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65  WAYS(p && p->pNe
3e70: 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20  xt==pIndex) ){. 
3e80: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
3e90: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3ea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3eb0: 20 20 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e     sqlite3FreeIn
3ec0: 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
3ed0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c  .  }.  db->mDbFl
3ee0: 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
3ef0: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  hemaChange;.}../
3f00: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67  *.** Look throug
3f10: 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70  h the list of op
3f20: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
3f30: 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61  s in db->aDb[] a
3f40: 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76  nd if.** any hav
3f50: 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72  e been closed, r
3f60: 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
3f70: 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c  the list.  Reall
3f80: 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d  ocate the.** db-
3f90: 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65  >aDb[] structure
3fa0: 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69   to a smaller si
3fb0: 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ze, if possible.
3fc0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28  .**.** Entry 0 (
3fd0: 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62  the "main" datab
3fe0: 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31  ase) and entry 1
3ff0: 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74   (the "temp" dat
4000: 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65  abase).** are ne
4010: 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66  ver candidates f
4020: 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73  or being collaps
4030: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4040: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4050: 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33  aseArray(sqlite3
4060: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   *db){.  int i, 
4070: 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20  j;.  for(i=j=2; 
4080: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
4090: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
40a0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
40b0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
40c0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
40d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
40e0: 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29  , pDb->zDbSName)
40f0: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ;.      pDb->zDb
4100: 53 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  SName = 0;.     
4110: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
4120: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
4130: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
4140: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
4150: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
4160: 7d 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b  }.  db->nDb = j;
4170: 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d  .  if( db->nDb<=
4180: 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62  2 && db->aDb!=db
4190: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20  ->aDbStatic ){. 
41a0: 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44     memcpy(db->aD
41b0: 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62  bStatic, db->aDb
41c0: 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  , 2*sizeof(db->a
41d0: 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c  Db[0]));.    sql
41e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
41f0: 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d  b->aDb);.    db-
4200: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
4210: 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  atic;.  }.}../*.
4220: 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63 68  ** Reset the sch
4230: 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74 61  ema for the data
4240: 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69 44  base at index iD
4250: 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74  b.  Also reset t
4260: 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d  he.** TEMP schem
4270: 61 2e 20 20 54 68 65 20 72 65 73 65 74 20 69 73  a.  The reset is
4280: 20 64 65 66 65 72 72 65 64 20 69 66 20 64 62 2d   deferred if db-
4290: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20  >nSchemaLock is 
42a0: 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66  not zero..** Def
42b0: 65 72 72 65 64 20 72 65 73 65 74 73 20 6d 61 79  erred resets may
42c0: 20 62 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69   be run by calli
42d0: 6e 67 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a  ng with iDb<0..*
42e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
42f0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
4300: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4310: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  b){.  int i;.  a
4320: 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
4330: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  Db );..  if( iDb
4340: 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  >=0 ){.    asser
4350: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
4360: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
4370: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53  b, 0) );.    DbS
4380: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  etProperty(db, i
4390: 44 62 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74  Db, DB_ResetWant
43a0: 65 64 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72  ed);.    DbSetPr
43b0: 6f 70 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42  operty(db, 1, DB
43c0: 5f 52 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20  _ResetWanted);. 
43d0: 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
43e0: 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d  &= ~DBFLAG_Schem
43f0: 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 20 20  aKnownOk;.  }.  
4400: 69 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c  if( db->nSchemaL
4410: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ock==0 ){.    fo
4420: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
4430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4440: 28 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28  ( DbHasProperty(
4450: 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57  db, i, DB_ResetW
4460: 61 6e 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  anted) ){.      
4470: 20 20 69 66 28 20 69 3d 3d 31 20 29 7b 0a 20 20    if( i==1 ){.  
4480: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
4490: 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61  chemaClear(db->a
44a0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
44b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
44c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
44d0: 53 63 68 65 6d 61 55 6e 75 73 65 28 64 62 2c 20  SchemaUnuse(db, 
44e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
44f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4500: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61  }../*.** Erase a
4510: 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d  ll schema inform
4520: 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20 61  ation from all a
4530: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
4540: 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  s (including.** 
4550: 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d 70  "main" and "temp
4560: 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ") for a single 
4570: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4580: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4590: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
45a0: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
45b0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
45c0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
45d0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
45e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
45f0: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4600: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4610: 64 62 2d 3e 6e 44 62 3b 20 69 3d 28 69 3f 69 2b  db->nDb; i=(i?i+
4620: 31 3a 32 29 29 7b 0a 20 20 20 20 73 71 6c 69 74  1:2)){.    sqlit
4630: 65 33 53 63 68 65 6d 61 55 6e 75 73 65 28 64 62  e3SchemaUnuse(db
4640: 2c 20 69 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , i);.  }.  sqli
4650: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
4660: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
4670: 61 29 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61  a);.  db->mDbFla
4680: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
4690: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
46a0: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
46b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
46c0: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
46d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
46e0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
46f0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
4700: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
4710: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4720: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4730: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
4740: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
4750: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
4760: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
4770: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 6d  e3 *db){.  db->m
4780: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4790: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
47a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
47b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
47c0: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
47d0: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
47e0: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
47f0: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
4800: 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rray)..*/.void s
4810: 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
4820: 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20  mnNames(sqlite3 
4830: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
4840: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
4850: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
4860: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
4870: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
4880: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
4890: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
48a0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
48b0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
48c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
48d0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
48e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
48f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4900: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
4910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
4920: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
4930: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zColl);.    }.  
4940: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4950: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  db, pTable->aCol
4960: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4970: 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72  Remove the memor
4980: 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  y data structure
4990: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
49a0: 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54  h the given.** T
49b0: 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65  able.  No change
49c0: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69  s are made to di
49d0: 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  sk by this routi
49e0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
49f0: 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65  outine just dele
4a00: 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72  tes the data str
4a10: 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73  ucture.  It does
4a20: 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74   not unlink.** t
4a30: 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74  he table data st
4a40: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
4a50: 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75   hash table.  Bu
4a60: 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f  t it does destro
4a70: 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75  y.** memory stru
4a80: 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e  ctures of the in
4a90: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4aa0: 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65  n keys associate
4ab0: 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74  d with .** the t
4ac0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
4ad0: 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  db parameter is 
4ae0: 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73  optional.  It is
4af0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54   needed if the T
4b00: 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  able object .** 
4b10: 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69  contains lookasi
4b20: 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62  de memory.  (Tab
4b30: 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  le objects in th
4b40: 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20  e schema do not 
4b50: 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  use.** lookaside
4b60: 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d   memory, but som
4b70: 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c  e ephemeral Tabl
4b80: 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20  e objects do.)  
4b90: 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72  Or the.** db par
4ba0: 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73  ameter can be us
4bb0: 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79  ed with db->pnBy
4bc0: 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73  tesFreed to meas
4bd0: 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a  ure the memory.*
4be0: 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61  * used by the Ta
4bf0: 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ble object..*/.s
4c00: 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54  tatic void SQLIT
4c10: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c 65 74  E_NOINLINE delet
4c20: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4c30: 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  db, Table *pTabl
4c40: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
4c50: 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a 23 69  dex, *pNext;..#i
4c60: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4c70: 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  G.  /* Record th
4c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
4c90: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
4ca0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
4cb0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
4cc0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
4cd0: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
4ce0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
4cf0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
4d00: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
4d10: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
4d20: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
4d30: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 69 6e   change. */.  in
4d40: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4d50: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 28 70  ;.  if( db && (p
4d60: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
4d70: 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
4d80: 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f 6b 61  =0 ){.    nLooka
4d90: 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  side = sqlite3Lo
4da0: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 20  okasideUsed(db, 
4db0: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
4dc0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4dd0: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4de0: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4df0: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4e00: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4e10: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4e20: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4e30: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4e40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4e50: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4e60: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4e70: 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 7c 7c  hema.         ||
4e80: 20 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   (IsVirtual(pTab
4e90: 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d 3e 69  le) && pIndex->i
4ea0: 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
4eb0: 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 20 29  DXTYPE_APPDEF) )
4ec0: 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d 3d 30  ;.    if( (db==0
4ed0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4ee0: 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49 73 56  reed==0) && !IsV
4ef0: 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
4f00: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
4f10: 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e  ame = pIndex->zN
4f20: 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54  ame; .      TEST
4f30: 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f  ONLY ( Index *pO
4f40: 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61  ld = ) sqlite3Ha
4f50: 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20  shInsert(.      
4f60: 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68     &pIndex->pSch
4f70: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
4f80: 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ame, 0.      );.
4f90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
4fa0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63  ==0 || sqlite3Sc
4fb0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4fc0: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
4fd0: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61  hema) );.      a
4fe0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
4ff0: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
5000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5010: 74 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c  te3FreeIndex(db,
5020: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
5030: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
5040: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
5050: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
5060: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
5070: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
5080: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
5090: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
50a0: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
50b0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
50c0: 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49  E_ENABLE_NORMALI
50d0: 5a 45 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  ZE.  if( pTable-
50e0: 3e 70 43 6f 6c 48 61 73 68 20 29 7b 0a 20 20 20  >pColHash ){.   
50f0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
5100: 72 28 70 54 61 62 6c 65 2d 3e 70 43 6f 6c 48 61  r(pTable->pColHa
5110: 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sh);.    sqlite3
5120: 5f 66 72 65 65 28 70 54 61 62 6c 65 2d 3e 70 43  _free(pTable->pC
5130: 6f 6c 48 61 73 68 29 3b 0a 20 20 7d 0a 23 65 6e  olHash);.  }.#en
5140: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  dif.  sqlite3Del
5150: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
5160: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  b, pTable);.  sq
5170: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5180: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
5190: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
51a0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
51b0: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
51c0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
51d0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
51e0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
51f0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
5200: 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23  able->pCheck);.#
5210: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5220: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5230: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
5240: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
5250: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
5260: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
5270: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
5280: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
5290: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
52a0: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
52b0: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
52c0: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
52d0: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 73 71  | nLookaside==sq
52e0: 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73  lite3LookasideUs
52f0: 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a 76 6f  ed(db,0) );.}.vo
5300: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
5310: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
5320: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
5330: 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64  ){.  /* Do not d
5340: 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20  elete the table 
5350: 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65  until the refere
5360: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
5370: 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28  s zero. */.  if(
5380: 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72   !pTable ) retur
5390: 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c  n;.  if( ((!db |
53a0: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
53b0: 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61  ed==0) && (--pTa
53c0: 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e 30 29  ble->nTabRef)>0)
53d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 65 6c   ) return;.  del
53e0: 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
53f0: 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ble);.}.../*.** 
5400: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
5410: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
5420: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
5430: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
5440: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
5450: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
5460: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
5470: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
5480: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
5490: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
54a0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
54b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
54c0: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
54d0: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
54e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
54f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
5500: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
5510: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
5520: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
5530: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
5540: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
5550: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
5560: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
5570: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
5580: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
5590: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
55a0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
55b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
55c0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
55d0: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
55e0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
55f0: 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  abName, 0);.  sq
5600: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
5610: 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 6d  (db, p);.  db->m
5620: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
5630: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
5640: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5650: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
5660: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
5670: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
5680: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
5690: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
56a0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
56b0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
56c0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
56d0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
56e0: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
56f0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
5700: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
5710: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
5720: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
5730: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
5740: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
5750: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
5760: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
5770: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
5780: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
5790: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
57a0: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
57b0: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
57c0: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
57d0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
57e0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
57f0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
5800: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
5810: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
5820: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
5830: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
5840: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5850: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
5860: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5870: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5880: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5890: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
58a0: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
58b0: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
58c0: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
58d0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
58e0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
58f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
5910: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
5920: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
5930: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
5940: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
5950: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
5960: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
5970: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5980: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5990: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
59a0: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
59b0: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
59c0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
59d0: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
59e0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
59f0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
5a00: 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52 5f 4e  OOT, 1, MASTER_N
5a10: 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  AME);.  sqlite3V
5a20: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
5a30: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
5a40: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
5a50: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
5a60: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
5a70: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
5a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5a90: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
5aa0: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
5ab0: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
5ac0: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
5ad0: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
5ae0: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
5af0: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5b00: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5b10: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
5b20: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
5b30: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
5b40: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
5b50: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
5b60: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5b70: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
5b80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5b90: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
5ba0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5bb0: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
5bc0: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
5bd0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5be0: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
5bf0: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
5c00: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62  b;.    for(i=(db
5c10: 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64  ->nDb-1), pDb=&d
5c20: 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b  b->aDb[i]; i>=0;
5c30: 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20   i--, pDb--){.  
5c40: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
5c50: 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62 2d 3e  e3_stricmp(pDb->
5c60: 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zDbSName, zName)
5c70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5c80: 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61 6c 77  /* "main" is alw
5c90: 61 79 73 20 61 6e 20 61 63 63 65 70 74 61 62 6c  ays an acceptabl
5ca0: 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  e alias for the 
5cb0: 70 72 69 6d 61 72 79 20 64 61 74 61 62 61 73 65  primary database
5cc0: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 69  .      ** even i
5cd0: 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 65  f it has been re
5ce0: 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51 4c 49  named using SQLI
5cf0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e  TE_DBCONFIG_MAIN
5d00: 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20 20 20  DBNAME. */.     
5d10: 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30 3d 3d   if( i==0 && 0==
5d20: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5d30: 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 20 29  "main", zName) )
5d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d50: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
5d60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
5d70: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
5d80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
5d90: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
5da0: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
5db0: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
5dc0: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
5dd0: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
5de0: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
5df0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
5e00: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
5e10: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
5e20: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
5e30: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
5e40: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
5e50: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
5e60: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5e70: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5ea0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5eb0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
5ee0: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
5ef0: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
5f00: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
5f10: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
5f20: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
5f30: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
5f40: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
5f50: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
5f60: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
5f70: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
5f80: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
5f90: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
5fa0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5fb0: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
5fc0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5fd0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5fe0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5ff0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6000: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
6010: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
6020: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
6030: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
6040: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
6050: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
6060: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
6070: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
6080: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
6090: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
60a0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
60b0: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
60c0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
60d0: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
60e0: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
60f0: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
6100: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
6110: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
6120: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
6130: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
6140: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
6150: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
6160: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
6170: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
6180: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
6190: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
61a0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
61b0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
61c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
61d0: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
61e0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
61f0: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
6200: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6210: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
6220: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
6230: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
6240: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
6250: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
6260: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
6270: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
6280: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
6290: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
62a0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
62b0: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
62c0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
62d0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
62e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
62f0: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
6300: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
6310: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6320: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
6330: 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69  pName2!=0 );.  i
6340: 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29  f( pName2->n>0 )
6350: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e  {.    if( db->in
6360: 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20  it.busy ) {.    
6370: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6380: 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75  g(pParse, "corru
6390: 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  pt database");. 
63a0: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
63b0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
63c0: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
63d0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
63e0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
63f0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
6400: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6410: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6420: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
6430: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
6440: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6450: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
6470: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
6480: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
6490: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
64a0: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  T.             |
64b0: 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  | (db->mDbFlags 
64c0: 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 29  & DBFLAG_Vacuum)
64d0: 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  !=0);.    iDb = 
64e0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20  db->init.iDb;.  
64f0: 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61    *pUnqual = pNa
6500: 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me1;.  }.  retur
6510: 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n iDb;.}../*.** 
6520: 54 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77  True if PRAGMA w
6530: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 20 69  ritable_schema i
6540: 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s ON.*/.int sqli
6550: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6560: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  a(sqlite3 *db){.
6570: 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62 2d    testcase( (db-
6580: 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57  >flags&(SQLITE_W
6590: 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54  riteSchema|SQLIT
65a0: 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 30  E_Defensive))==0
65b0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
65c0: 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49  (db->flags&(SQLI
65d0: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
65e0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
65f0: 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )==.            
6600: 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53     SQLITE_WriteS
6610: 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73 74 63  chema );.  testc
6620: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6630: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6640: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
6650: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
6660: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
6670: 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20 74 65  efensive );.  te
6680: 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61  stcase( (db->fla
6690: 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65  gs&(SQLITE_Write
66a0: 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65  Schema|SQLITE_De
66b0: 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20  fensive))==.    
66c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
66d0: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53  TE_WriteSchema|S
66e0: 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29  QLITE_Defensive)
66f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 62   );.  return (db
6700: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6710: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6720: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6730: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
6740: 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ma;.}../*.** Thi
6750: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6760: 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
6770: 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a  e UTF-8 string z
6780: 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a  Name is a legal.
6790: 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e  ** unqualified n
67a0: 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63  ame for a new sc
67b0: 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62  hema object (tab
67c0: 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20  le, index, view 
67d0: 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20  or.** trigger). 
67e0: 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65  All names are le
67f0: 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65  gal except those
6800: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
6810: 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22   the string.** "
6820: 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70  sqlite_" (in upp
6830: 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78  er, lower or mix
6840: 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20 70  ed case). This p
6850: 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61  ortion of the na
6860: 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65  mespace.** is re
6870: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
6880: 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20  nal use..*/.int 
6890: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
68a0: 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50  ctName(Parse *pP
68b0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
68c0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *zName){.  if( 
68d0: 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69  !pParse->db->ini
68e0: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
68f0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20  ->nested==0 .   
6900: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
6910: 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28  3WritableSchema(
6920: 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 0a 20  pParse->db)==0. 
6930: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6940: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
6950: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
6960: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
6970: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6980: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
6990: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
69a0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
69b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
69c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
69d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
69e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
69f0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
6a00: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
6a10: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
6a20: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
6a30: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
6a40: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
6a50: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
6a60: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
6a70: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
6a80: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
6a90: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
6aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6ab0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
6ac0: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
6ad0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
6ae0: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
6af0: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
6b00: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
6b10: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
6b20: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
6b30: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
6b40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6b50: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
6b60: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6b70: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
6b80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
6b90: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
6ba0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
6bb0: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
6bc0: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
6bd0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6be0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
6bf0: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
6c00: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
6c10: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
6c20: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
6c30: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6c40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6c50: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
6c60: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
6c70: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
6c80: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
6c90: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
6ca0: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
6cb0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
6cc0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
6cd0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
6ce0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
6cf0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
6d00: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
6d10: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
6d20: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
6d30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6d40: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
6d50: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
6d60: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
6d70: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
6d80: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
6d90: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
6da0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
6db0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
6dc0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
6dd0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
6de0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6df0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
6e00: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6e10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
6e20: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
6e30: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6e40: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6e50: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6e60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6e70: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
6e80: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
6e90: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6ea0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
6eb0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
6ec0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
6ed0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
6ee0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
6ef0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
6f00: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
6f10: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
6f20: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
6f30: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6f40: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6f50: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6f60: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6f70: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
6f80: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6f90: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6fa0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
6fb0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6fc0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
6fd0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
6fe0: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
6ff0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
7000: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
7010: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
7020: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
7030: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
7040: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
7050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
7060: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
7070: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
7080: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
7090: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
70a0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
70b0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
70c0: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
70d0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
70e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
70f0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
7100: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7110: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
7120: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
7130: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
7140: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
7150: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
7160: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
7170: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
7180: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
7190: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
71a0: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  */..  if( db->in
71b0: 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69  it.busy && db->i
71c0: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29  nit.newTnum==1 )
71d0: 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c  {.    /* Special
71e0: 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20   case:  Parsing 
71f0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
7200: 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  r or sqlite_temp
7210: 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a  _master schema *
7220: 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  /.    iDb = db->
7230: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e  init.iDb;.    zN
7240: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7250: 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41  trDup(db, SCHEMA
7260: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
7270: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
7280: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
7290: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
72a0: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
72b0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
72c0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
72d0: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
72e0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
72f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
7300: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7310: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
7320: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
7330: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =1 ){.      /* I
7340: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
7350: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
7360: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
7370: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
7380: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
7390: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
73a0: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
73b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
73c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
73d0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
73e0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
73f0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
7400: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
7410: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
7420: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
7430: 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e   iDb = 1;.    zN
7440: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
7450: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
7460: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49  Name);.    if( I
7470: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
7480: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7490: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
74a0: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e  Parse, (void*)zN
74b0: 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ame, pName);.   
74c0: 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d   }.  }.  pParse-
74d0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
74e0: 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  Name;.  if( zNam
74f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
7500: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
7510: 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
7520: 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
7530: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  Name) ){.    got
7540: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7550: 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ror;.  }.  if( d
7560: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29  b->init.iDb==1 )
7570: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66   isTemp = 1;.#if
7580: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7590: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
75a0: 20 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d   assert( isTemp=
75b0: 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20  =0 || isTemp==1 
75c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  );.  assert( isV
75d0: 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
75e0: 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73  ==1 );.  {.    s
75f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
7600: 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Code[] = {.     
7610: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
7620: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
7630: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
7640: 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53  _TABLE,.       S
7650: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45  QLITE_CREATE_VIE
7660: 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  W,.       SQLITE
7670: 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45  _CREATE_TEMP_VIE
7680: 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  W.    };.    cha
7690: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
76a0: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
76b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
76c0: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
76d0: 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
76e0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54  SCHEMA_TABLE(isT
76f0: 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  emp), 0, zDb) ){
7700: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7710: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7720: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
7730: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
7740: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7750: 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69  se, (int)aCode[i
7760: 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c  sTemp+2*isView],
7770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30          zName, 0
77a0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
77b0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
77c0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
77d0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
77e0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
77f0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73   table name does
7800: 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74   not collide wit
7810: 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20  h an existing.  
7820: 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
7830: 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61  e name in the sa
7840: 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73  me database.  Is
7850: 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  sue an error mes
7860: 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20  sage if.  ** it 
7870: 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74  does. The except
7880: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74  ion is if the st
7890: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61  atement being pa
78a0: 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a  rsed was passed.
78b0: 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74    ** to an sqlit
78c0: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
78d0: 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20  ) call. In that 
78e0: 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f  case only the co
78f0: 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20  lumn names.  ** 
7900: 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62  and types will b
7910: 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65  e used, so there
7920: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74   is no need to t
7930: 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63  est for namespac
7940: 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e  e.  ** collision
7950: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49  s..  */.  if( !I
7960: 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
7970: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
7980: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7990: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66  zDbSName;.    if
79a0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
79b0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
79c0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
79d0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
79e0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
79f0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7a00: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
7a10: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
7a20: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7a30: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7a40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7a50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a60: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7a70: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7a80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7a90: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7aa0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7ab0: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7ac0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7ad0: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
7ae0: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
7af0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
7b00: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7b10: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7b20: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7b30: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7b40: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7b50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7b60: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
7b70: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7b80: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7b90: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7ba0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7bb0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7bc0: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7bd0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7be0: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7bf0: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
7c00: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
7c10: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
7c20: 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73  led );.    pPars
7c30: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7c40: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70  OMEM_BKPT;.    p
7c50: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7c60: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7c70: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7c80: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7c90: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7ca0: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
7cb0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
7cc0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
7cd0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
7ce0: 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23  ->nTabRef = 1;.#
7cf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
7d00: 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54  AULT_ROWEST.  pT
7d10: 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  able->nRowLogEst
7d20: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
7d30: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
7d40: 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20  ROWEST);.#else. 
7d50: 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67   pTable->nRowLog
7d60: 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
7d70: 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
7d80: 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
7d90: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
7da0: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
7db0: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7dc0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
7dd0: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
7de0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7df0: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7e00: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7e10: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
7e20: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
7e30: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
7e40: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
7e50: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
7e60: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
7e70: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
7e80: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
7e90: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7ea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7eb0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7ec0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7ed0: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7ee0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7ef0: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7f00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7f10: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
7f20: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
7f30: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
7f40: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
7f50: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
7f60: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
7f70: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
7f80: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
7f90: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7fa0: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7fb0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7fc0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7fd0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7fe0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7ff0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
8000: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
8010: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
8020: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
8030: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
8040: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
8050: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
8060: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
8070: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
8080: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
8090: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
80a0: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
80b0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
80c0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
80d0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
80e0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
80f0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
8100: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
8110: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
8120: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
8130: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
8140: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
8150: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
8160: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20    int addr1;.   
8170: 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b   int fileFormat;
8180: 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72  .    int reg1, r
8190: 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f  eg2, reg3;.    /
81a0: 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61  * nullRow[] is a
81b0: 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f  n OP_Record enco
81c0: 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f  ding of a row co
81d0: 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73  ntaining 5 NULLs
81e0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
81f0: 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f  onst char nullRo
8200: 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c  w[] = { 6, 0, 0,
8210: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
8220: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
8230: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
8240: 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
8250: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8260: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
8270: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
8280: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8290: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
82a0: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
82b0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
82c0: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
82d0: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
82e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
82f0: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
8300: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
8310: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
8320: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
8330: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
8340: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
8350: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
8360: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
8370: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
8380: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
8390: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
83a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
83b0: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
83c0: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
83d0: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
83e0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
83f0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
8400: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
8410: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
8420: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
8430: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8440: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
8450: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
8460: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
8470: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
8480: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
8490: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
84a0: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
84b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
84c0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
84d0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
84e0: 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b  AT, fileFormat);
84f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8500: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
8510: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
8520: 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47  EE_TEXT_ENCODING
8530: 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20  , ENC(db));.    
8540: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
8550: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
8560: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
8570: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
8580: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
8590: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
85a0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
85b0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
85c0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
85d0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
85e0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
85f0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
8600: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
8610: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
8620: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
8630: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
8640: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
8650: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
8660: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
8670: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
8680: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
8690: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
86a0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
86b0: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
86c0: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
86d0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
86e0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
86f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
8700: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
8710: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
8720: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
8730: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
8740: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
8750: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8760: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
8770: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8780: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8790: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
87a0: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
87b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
87c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
87d0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
87e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
87f0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70  if.    {.      p
8800: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
8810: 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   =.         sqli
8820: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8830: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c   OP_CreateBtree,
8840: 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45   iDb, reg2, BTRE
8850: 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d  E_INTKEY);.    }
8860: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
8870: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
8880: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
8890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
88a0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
88b0: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
88c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
88d0: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72  v, OP_Blob, 6, r
88e0: 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c  eg3, 0, nullRow,
88f0: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
8900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8910: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
8920: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
8930: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8940: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8950: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8960: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8970: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8980: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8990: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
89a0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
89b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
89c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
89d0: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
89e0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
89f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8a00: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
8a10: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70  urn;.}../* Set p
8a20: 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74  roperties of a t
8a30: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65  able column base
8a40: 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61  d on the (magica
8a50: 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68  l).** name of th
8a60: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66  e column..*/.#if
8a70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48   SQLITE_ENABLE_H
8a80: 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f  IDDEN_COLUMNS.vo
8a90: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  id sqlite3Column
8aa0: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
8ab0: 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  me(Table *pTab, 
8ac0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20  Column *pCol){. 
8ad0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
8ae0: 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  nicmp(pCol->zNam
8af0: 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c  e, "__hidden__",
8b00: 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70   10)==0 ){.    p
8b10: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
8b20: 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b   COLFLAG_HIDDEN;
8b30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61  .  }else if( pTa
8b40: 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d  b && pCol!=pTab-
8b50: 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d  >aCol && (pCol[-
8b60: 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  1].colFlags & CO
8b70: 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b  LFLAG_HIDDEN) ){
8b80: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
8b90: 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64  ags |= TF_OOOHid
8ba0: 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  den;.  }.}.#endi
8bb0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
8bc0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
8bd0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
8be0: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
8bf0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
8c00: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
8c10: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
8c20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
8c30: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
8c40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8c50: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
8c60: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
8c70: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
8c80: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
8c90: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
8ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8cb0: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
8cc0: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
8cd0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
8ce0: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
8cf0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20  , Token *pName, 
8d00: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
8d10: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8d20: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8d30: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20   char *zType;.  
8d40: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8d50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8d60: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8d70: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8d80: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
8d90: 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43  urn;.  if( p->nC
8da0: 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  ol+1>db->aLimit[
8db0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8dc0: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
8dd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8de0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
8df0: 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d  lumns on %s", p-
8e00: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
8e10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  urn;.  }.  z = s
8e20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
8e30: 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b  w(db, pName->n +
8e40: 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a   pType->n + 2);.
8e50: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
8e60: 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  urn;.  if( IN_RE
8e70: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71  NAME_OBJECT ) sq
8e80: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
8e90: 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  Map(pParse, (voi
8ea0: 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  d*)z, pName);.  
8eb0: 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d  memcpy(z, pName-
8ec0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20  >z, pName->n);. 
8ed0: 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30   z[pName->n] = 0
8ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
8ef0: 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30  te(z);.  for(i=0
8f00: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
8f10: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
8f20: 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d  e3_stricmp(z, p-
8f30: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  >aCol[i].zName)=
8f40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8f50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8f60: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
8f70: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
8f80: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
8f90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
8fa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8fb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
8fc0: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
8fd0: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
8fe0: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
8ff0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
9000: 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  oc(db,p->aCol,(p
9010: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
9020: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
9030: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
9040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
9050: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
9060: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9070: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
9080: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
9090: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
90a0: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
90b0: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
90c0: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
90d0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
90e0: 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50    sqlite3ColumnP
90f0: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
9100: 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20  e(p, pCol);. .  
9110: 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20  if( pType->n==0 
9120: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
9130: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
9140: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
9150: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
9160: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a  t affinity.    *
9170: 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61 20  * 'BLOB' with a 
9180: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
9190: 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
91a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
91b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
91c0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  ;.    pCol->szEs
91d0: 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  t = 1;.#ifdef SQ
91e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
91f0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
9200: 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65 33    if( 4>=sqlite3
9210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
9220: 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20  orterRef ){.    
9230: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
9240: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54   |= COLFLAG_SORT
9250: 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERREF;.    }.#en
9260: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
9270: 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c   zType = z + sql
9280: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
9290: 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  + 1;.    memcpy(
92a0: 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c  zType, pType->z,
92b0: 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20   pType->n);.    
92c0: 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20  zType[pType->n] 
92d0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
92e0: 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a  Dequote(zType);.
92f0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
9300: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
9310: 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20  nityType(zType, 
9320: 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c 2d  pCol);.    pCol-
9330: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
9340: 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20  FLAG_HASTYPE;.  
9350: 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20  }.  p->nCol++;. 
9360: 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61   pParse->constra
9370: 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d  intName.n = 0;.}
9380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
9390: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
93a0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
93b0: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
93c0: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
93d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
93e0: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
93f0: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
9400: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
9410: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
9420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
9430: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
9440: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
9450: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
9460: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9470: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
9480: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
9490: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
94a0: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
94b0: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
94c0: 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72  pCol;.  p = pPar
94d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
94e0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
94f0: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
9500: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
9510: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
9520: 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f  l-1];.  pCol->no
9530: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
9540: 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61  ror;.  p->tabFla
9550: 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e  gs |= TF_HasNotN
9560: 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ull;..  /* Set t
9570: 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66  he uniqNotNull f
9580: 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55  lag on any UNIQU
9590: 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20  E or PK indexes 
95a0: 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 0a  already created.
95b0: 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c    ** on this col
95c0: 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  umn.  */.  if( p
95d0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20  Col->colFlags & 
95e0: 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29  COLFLAG_UNIQUE )
95f0: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
9600: 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
9610: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
9620: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
9630: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
9640: 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d  ( pIdx->nKeyCol=
9650: 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72  =1 && pIdx->onEr
9660: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
9670: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
9680: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e  aiColumn[0]==p->
9690: 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  nCol-1 ){.      
96a0: 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e    pIdx->uniqNotN
96b0: 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ull = 1;.      }
96c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
96d0: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
96e0: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
96f0: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
9700: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
9710: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
9720: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
9730: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9740: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
9750: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
9760: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
9770: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
9780: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
9790: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
97a0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
97b0: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
97c0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
97d0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
97e0: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
97f0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
9800: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
9810: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
9820: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
9830: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
9840: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
9850: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
9860: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
9870: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
9880: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
9890: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
98a0: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
98b0: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
98e0: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
98f0: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
9900: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
9910: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9920: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
9930: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9940: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
9950: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
9960: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
9970: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
9980: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
9990: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
99a0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
99b0: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
99c0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
99d0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
99e0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
99f0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
9a00: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
9a10: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
9a20: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
9a30: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
9a40: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
9a50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
9a60: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
9a70: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61  tyType(const cha
9a80: 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a  r *zIn, Column *
9a90: 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20 3d  pCol){.  u32 h =
9aa0: 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d   0;.  char aff =
9ab0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
9ac0: 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  RIC;.  const cha
9ad0: 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20  r *zChar = 0;.. 
9ae0: 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20   assert( zIn!=0 
9af0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b  );.  while( zIn[
9b00: 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  0] ){.    h = (h
9b10: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
9b20: 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e  perToLower[(*zIn
9b30: 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e  )&0xff];.    zIn
9b40: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
9b50: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
9b60: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
9b70: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
9b80: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
9b90: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9ba0: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a  FF_TEXT;.      z
9bb0: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20  Char = zIn;.    
9bc0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9bd0: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
9be0: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
9bf0: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
9c00: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9c10: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
9c20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
9c30: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
9c40: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
9c50: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
9c60: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
9c70: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9c80: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
9c90: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
9ca0: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9cb0: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
9cc0: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
9cd0: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
9ce0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9cf0: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
9d00: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
9d10: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9d20: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
9d30: 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27   if( zIn[0]=='('
9d40: 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a   ) zChar = zIn;.
9d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9d60: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
9d70: 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  NT.    }else if(
9d80: 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28   h==(('r'<<24)+(
9d90: 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'e'<<16)+('a'<<8
9da0: 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20  )+'l')          
9db0: 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20  /* REAL */.     
9dc0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
9dd0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9de0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9df0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
9e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9e10: 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('f'<<24)+('l'<<
9e20: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27  16)+('o'<<8)+'a'
9e30: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c  )          /* FL
9e40: 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OA */.        &&
9e50: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
9e60: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9e70: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9e80: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
9e90: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c  se if( h==(('d'<
9ea0: 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28  <24)+('o'<<16)+(
9eb0: 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'u'<<8)+'b')    
9ec0: 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f        /* DOUB */
9ed0: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
9ee0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9ef0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
9f00: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
9f10: 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  AL;.#endif.    }
9f20: 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30  else if( (h&0x00
9f30: 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c  FFFFFF)==(('i'<<
9f40: 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27  16)+('n'<<8)+'t'
9f50: 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a  ) ){    /* INT *
9f60: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9f70: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9f80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9f90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
9fa0: 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55  f pCol is not NU
9fb0: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
9fc0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
9fd0: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
9fe0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
9ff0: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
a000: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
a010: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
a020: 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
a030: 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f 2a   int v = 0;   /*
a040: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73   default size is
a050: 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20   approx 4 bytes 
a060: 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53  */.    if( aff<S
a070: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
a080: 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  C ){.      if( z
a090: 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Char ){.        
a0a0: 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20  while( zChar[0] 
a0b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a0c0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
a0d0: 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20  zChar[0]) ){.   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
a0f0: 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c  (k), VARCHAR(k),
a100: 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b   CHAR(k) -> r=(k
a110: 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  /4+1) */.       
a120: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
a130: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
a140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
a150: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
a160: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
a170: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
a180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a190: 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20 42    v = 16;   /* B
a1a0: 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20  LOB, TEXT, CLOB 
a1b0: 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20  -> r=5  (approx 
a1c0: 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20  20 bytes)*/.    
a1d0: 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
a1e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
a1f0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
a200: 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c 69  .    if( v>=sqli
a210: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
a220: 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20  szSorterRef ){. 
a230: 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c       pCol->colFl
a240: 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53  ags |= COLFLAG_S
a250: 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a  ORTERREF;.    }.
a260: 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20 76  #endif.    v = v
a270: 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  /4 + 1;.    if( 
a280: 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b  v>255 ) v = 255;
a290: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  .    pCol->szEst
a2a0: 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
a2b0: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
a2c0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a2d0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
a2e0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
a2f0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
a300: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
a310: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
a320: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
a330: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
a340: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
a350: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
a360: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
a370: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
a380: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
a390: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
a3a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a3b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
a3c0: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
a3d0: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
a3e0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
a3f0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
a400: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
a410: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20  dDefaultValue(. 
a420: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
a440: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a450: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
a460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a470: 65 20 70 61 72 73 65 64 20 65 78 70 72 65 73 73  e parsed express
a480: 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75  ion of the defau
a490: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f  lt value */.  co
a4a0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
a4b0: 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20  ,      /* Start 
a4c0: 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  of the default v
a4d0: 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63  alue text */.  c
a4e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
a4f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
a500: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
a510: 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76 61  end of defaut va
a520: 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20  lue text */.){. 
a530: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
a540: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
a550: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a560: 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61  e->db;.  p = pPa
a570: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a580: 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20    if( p!=0 ){.  
a590: 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43    pCol = &(p->aC
a5a0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a  ol[p->nCol-1]);.
a5b0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
a5c0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a5d0: 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20  Function(pExpr, 
a5e0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29  db->init.busy) )
a5f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
a600: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a610: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
a620: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
a630: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
a640: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
a650: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
a660: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
a670: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
a680: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
a690: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
a6a0: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
a6b0: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
a6c0: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
a6d0: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20  atile memory..  
a6e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
a6f0: 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r x;.      sqlit
a700: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a710: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
a720: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20       memset(&x, 
a730: 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
a740: 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53       x.op = TK_S
a750: 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a  PAN;.      x.u.z
a760: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44  Token = sqlite3D
a770: 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74  bSpanDup(db, zSt
a780: 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20  art, zEnd);.    
a790: 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70    x.pLeft = pExp
a7a0: 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73  r;.      x.flags
a7b0: 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20   = EP_Skip;.    
a7c0: 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20    pCol->pDflt = 
a7d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
a7e0: 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52  b, &x, EXPRDUP_R
a7f0: 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71  EDUCE);.      sq
a800: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a810: 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  x.u.zToken);.   
a820: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f   }.  }.  if( IN_
a830: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
a850: 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72  meExprUnmap(pPar
a860: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a  se, pExpr);.  }.
a870: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a880: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
a890: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72  }../*.** Backwar
a8a0: 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds Compatibility
a8b0: 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69   Hack:.** .** Hi
a8c0: 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e  storical version
a8d0: 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65  s of SQLite acce
a8e0: 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20  pted strings as 
a8f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a  column names in.
a900: 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50  ** indexes and P
a910: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
a920: 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e  raints and in UN
a930: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
a940: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
a950: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
a960: 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65  LE xyz(a,b,c,d,e
a970: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27  ,PRIMARY KEY('a'
a980: 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27  ),UNIQUE('b','c'
a990: 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a   COLLATE trim).*
a9a0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  *     CREATE IND
a9b0: 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63  EX abc ON xyz('c
a9c0: 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43  ','d' DESC,'e' C
a9d0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45  OLLATE nocase DE
a9e0: 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SC);.**.** This 
a9f0: 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74  is goofy.  But t
aa00: 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77  o preserve backw
aa10: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
aa20: 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74  ty we continue t
aa30: 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20  o.** accept it. 
aa40: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
aa50: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
aa60: 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74   conversion.  It
aa70: 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65   converts.** the
aa80: 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65   expression give
aa90: 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e  n in its argumen
aaa0: 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49  t from a TK_STRI
aab0: 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a  NG into a TK_ID.
aac0: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
aad0: 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54  sion is just a T
aae0: 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e  K_STRING with an
aaf0: 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54   optional COLLAT
ab00: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20  E clause..** If 
ab10: 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69  the epxression i
ab20: 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  s anything other
ab30: 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c   than TK_STRING,
ab40: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ab50: 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  is.** unchanged.
ab60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ab70: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
ab80: 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  d(Expr *p){.  if
ab90: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
aba0: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  NG ){.    p->op 
abb0: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65  = TK_ID;.  }else
abc0: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
abd0: 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65  OLLATE && p->pLe
abe0: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  ft->op==TK_STRIN
abf0: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66  G ){.    p->pLef
ac00: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  t->op = TK_ID;. 
ac10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69   }.}../*.** Desi
ac20: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
ac30: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
ac40: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
ac50: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
ac60: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
ac70: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
ac80: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
ac90: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
aca0: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
acb0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
acc0: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
acd0: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
ace0: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
acf0: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
ad00: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
ad10: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
ad20: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
ad30: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
ad40: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
ad50: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
ad60: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
ad70: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
ad80: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
ad90: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
ada0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
adb0: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
adc0: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
add0: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
ade0: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
adf0: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
ae00: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
ae10: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
ae20: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
ae30: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
ae40: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
ae50: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
ae60: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
ae70: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
ae80: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
ae90: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
aea0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
aeb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
aec0: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
aed0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
aee0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
aef0: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
af00: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
af10: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
af20: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
af30: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
af40: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
af50: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
af60: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
af70: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
af80: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
af90: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
afa0: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
afb0: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
afc0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
afd0: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
afe0: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
aff0: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
b000: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
b010: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
b020: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
b030: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
b040: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
b050: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
b060: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
b070: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
b080: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
b090: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
b0a0: 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  able;.  Column *
b0b0: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
b0c0: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
b0d0: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28  int nTerm;.  if(
b0e0: 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
b0f0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b100: 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  ;.  if( pTab->ta
b110: 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50  bFlags & TF_HasP
b120: 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20  rimaryKey ){.   
b130: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b140: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
b150: 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61  "table \"%s\" ha
b160: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
b170: 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54  primary key", pT
b180: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
b190: 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79  goto primary_key
b1a0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61  _exit;.  }.  pTa
b1b0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
b1c0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b  F_HasPrimaryKey;
b1d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
b1e0: 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
b1f0: 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  ab->nCol - 1;.  
b200: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
b210: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
b220: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b230: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b240: 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31  Y;.    nTerm = 1
b250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
b260: 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Term = pList->nE
b270: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
b280: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
b290: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45  .      Expr *pCE
b2a0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
b2b0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69  rSkipCollate(pLi
b2c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
b2d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b2e0: 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  CExpr!=0 );.    
b2f0: 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
b300: 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20  oId(pCExpr);.   
b310: 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
b320: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
b330: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b340: 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d  zCName = pCExpr-
b350: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
b360: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
b370: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
b380: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
b390: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
b3a0: 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54  rICmp(zCName, pT
b3b0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
b3c0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
b3d0: 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
b3e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
b400: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
b410: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
b420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
b430: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
b440: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b450: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
b460: 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26  ( nTerm==1.   &&
b470: 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69   pCol.   && sqli
b480: 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74  te3StrICmp(sqlit
b490: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
b4a0: 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22  l,""), "INTEGER"
b4b0: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
b4c0: 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder!=SQLITE_SO_
b4d0: 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69 66  DESC.  ){.    if
b4e0: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
b4f0: 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  CT && pList ){. 
b500: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61       sqlite3Rena
b510: 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61  meTokenRemap(pPa
b520: 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65  rse, &pTab->iPKe
b530: 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y, pList->a[0].p
b540: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Expr);.    }.   
b550: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
b560: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
b570: 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45  eyConf = (u8)onE
b580: 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
b590: 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20  ( autoInc==0 || 
b5a0: 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20  autoInc==1 );.  
b5b0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
b5c0: 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41   |= autoInc*TF_A
b5d0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20  utoincrement;.  
b5e0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50    if( pList ) pP
b5f0: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
b600: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  er = pList->a[0]
b610: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65  .sortOrder;.  }e
b620: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
b630: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b640: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
b650: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
b660: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b670: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
b680: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
b690: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
b6a0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
b6b0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
b6c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b6d0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
b6e0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
b6f0: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
b700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
b720: 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51  sortOrder, 0, SQ
b730: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
b740: 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c  MARYKEY);.    pL
b750: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
b760: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
b770: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b780: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
b790: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
b7a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
b7b0: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
b7c0: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
b7d0: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
b7e0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
b7f0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
b800: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
b810: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
b820: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
b830: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b840: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
b850: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
b860: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
b870: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
b880: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
b890: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
b8a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
b8b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b8c0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b8d0: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
b8e0: 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26  ECLARE_VTAB.   &
b8f0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  & !sqlite3BtreeI
b900: 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44  sReadonly(db->aD
b910: 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e  b[db->init.iDb].
b920: 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  pBt).  ){.    pT
b930: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
b940: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
b950: 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  nd(pParse, pTab-
b960: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
b970: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  xpr);.    if( pP
b980: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
b990: 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20  Name.n ){.      
b9a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
b9b0: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
b9c0: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50  Tab->pCheck, &pP
b9d0: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
b9e0: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Name, 1);.    }.
b9f0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ba00: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
ba10: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
ba20: 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  >db, pCheckExpr)
ba30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
ba40: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
ba50: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
ba60: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
ba70: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
ba80: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
ba90: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
baa0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
bab0: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
bac0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
bad0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
bae0: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
baf0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
bb10: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
bb20: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
bb30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
bb40: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
bb50: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
bb60: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
bb70: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
bb80: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
bb90: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
bba0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
bbb0: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
bbc0: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
bbd0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
bbe0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
bbf0: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
bc00: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
bc10: 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Idx;.    sqlite3
bc20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
bc30: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20  ol[i].zColl);.  
bc40: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
bc50: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
bc60: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
bc70: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
bc80: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
bc90: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
bca0: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
bcb0: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
bcc0: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
bcd0: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
bce0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
bcf0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
bd00: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
bd10: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
bd20: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
bd30: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
bd40: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
bd50: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
bd60: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
bd70: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
bd80: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
bd90: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
bda0: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
bdb0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
bdc0: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
bdd0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
bde0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
bdf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
be00: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
be10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
be20: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
be30: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
be40: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
be50: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
be60: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
be70: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
be80: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
be90: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
bea0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
beb0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
bec0: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
bed0: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
bee0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
bef0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
bf00: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
bf10: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
bf20: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
bf30: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
bf40: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
bf50: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
bf60: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
bf70: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
bf80: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
bf90: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
bfa0: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
bfb0: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
bfc0: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
bfd0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
bfe0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
bff0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
c000: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
c010: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
c020: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
c030: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
c040: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
c050: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
c060: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
c070: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
c080: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
c090: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
c0a0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c0b0: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
c0c0: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
c0d0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
c0e0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
c0f0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
c100: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
c110: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
c120: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  or message..**.*
c130: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
c140: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
c150: 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  , sqlite3GetColl
c160: 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  Seq().*/.CollSeq
c170: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
c180: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
c190: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
c1a0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
c1b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
c1c0: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
c1d0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
c1e0: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
c1f0: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
c200: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
c210: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
c220: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
c230: 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , zName, initbus
c240: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
c250: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
c260: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
c270: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
c280: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
c290: 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43  (pParse, enc, pC
c2a0: 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  oll, zName);.  }
c2b0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
c2c0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
c2d0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
c2e0: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
c2f0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
c300: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
c310: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
c320: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
c330: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
c340: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
c350: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
c360: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
c370: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
c380: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
c390: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
c3a0: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
c3b0: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
c3c0: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
c3d0: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
c3e0: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
c3f0: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
c400: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
c410: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
c420: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
c430: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
c440: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
c450: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
c460: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
c470: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
c480: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
c490: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
c4a0: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
c4b0: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
c4c0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
c4d0: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
c4e0: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
c4f0: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
c500: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
c510: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
c520: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
c530: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
c540: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
c550: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
c560: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
c570: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
c580: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
c590: 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d  gh..**.** IMPLEM
c5a0: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33  ENTATION-OF: R-3
c5b0: 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74  4230-56049 SQLit
c5c0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
c5d0: 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  increments.** th
c5e0: 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e  e schema-version
c5f0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 73 63   whenever the sc
c600: 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f  hema changes..*/
c610: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61  .void sqlite3Cha
c620: 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20  ngeCookie(Parse 
c630: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
c640: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c650: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c660: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
c670: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
c680: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
c690: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
c6a0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69  Db, 0) );.  sqli
c6b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c6c0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
c6d0: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
c6e0: 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20  _VERSION, .     
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
c700: 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65 64 29  nt)(1+(unsigned)
c710: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
c720: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
c730: 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  kie));.}../*.** 
c740: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
c750: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
c760: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
c770: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
c780: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
c790: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
c7a0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
c7b0: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
c7c0: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
c7d0: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
c7e0: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
c7f0: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
c800: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
c810: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
c820: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
c830: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
c840: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
c850: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
c860: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
c870: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
c880: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
c890: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
c8a0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
c8b0: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
c8c0: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
c8d0: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
c8e0: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62  r to an output b
c8f0: 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  uffer. The secon
c900: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
c910: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c920: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
c930: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
c940: 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20  set at.** which 
c950: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
c960: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
c970: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c980: 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c  opies the.** nul
c990: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
c9a0: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
c9b0: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
c9c0: 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65  eter, zSignedIde
c9d0: 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70  nt,.** to the sp
c9e0: 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69  ecified offset i
c9f0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64  n the buffer and
ca00: 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74   updates *pIdx t
ca10: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68  o refer.** to th
ca20: 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  e first byte aft
ca30: 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  er the last byte
ca40: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
ca50: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a  returning..** .*
ca60: 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20  * If the string 
ca70: 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e  zSignedIdent con
ca80: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
ca90: 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a  f alpha-numeric.
caa0: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64  ** characters, d
cab0: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
cac0: 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69  th a digit and i
cad0: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79  s not an SQL key
cae0: 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  word,.** then it
caf0: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
cb00: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
cb10: 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73  exactly as it is
cb20: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
cb30: 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69  it is quoted usi
cb40: 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ng double-quotes
cb50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cb60: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
cb70: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
cb80: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
cb90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
cba0: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
cbb0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
cbc0: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
cbd0: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
cbe0: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a  ;.  i = *pIdx;..
cbf0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
cc00: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
cc10: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c  if( !sqlite3Isal
cc20: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
cc30: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
cc40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
cc50: 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69  needQuote = sqli
cc60: 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e  te3Isdigit(zIden
cc70: 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20  t[0]).          
cc80: 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77    || sqlite3Keyw
cc90: 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20  ordCode(zIdent, 
cca0: 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20  j)!=TK_ID.      
ccb0: 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b        || zIdent[
ccc0: 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  j]!=0.          
ccd0: 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66    || j==0;..  if
cce0: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
ccf0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  i++] = '"';.  fo
cd00: 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d  r(j=0; zIdent[j]
cd10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b  ; j++){.    z[i+
cd20: 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a  +] = zIdent[j];.
cd30: 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a      if( zIdent[j
cd40: 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20  ]=='"' ) z[i++] 
cd50: 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28  = '"';.  }.  if(
cd60: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
cd70: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69  ++] = '"';.  z[i
cd80: 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d  ] = 0;.  *pIdx =
cd90: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   i;.}../*.** Gen
cda0: 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54  erate a CREATE T
cdb0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61  ABLE statement a
cdc0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
cdd0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c  he given.** tabl
cde0: 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f  e.  Memory to ho
cdf0: 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  ld the text of t
ce00: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
ce10: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
ce20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
ce30: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
ce40: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
ce50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
ce60: 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74  atic char *creat
ce70: 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74  eTableStmt(sqlit
ce80: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
ce90: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e  ){.  int i, k, n
cea0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b  ;.  char *zStmt;
ceb0: 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a  .  char *zSep, *
cec0: 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20  zSep2, *zEnd;.  
ced0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
cee0: 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f  n = 0;.  for(pCo
cef0: 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  l = p->aCol, i=0
cf00: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
cf10: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e  , pCol++){.    n
cf20: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
cf30: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35  pCol->zName) + 5
cf40: 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  ;.  }.  n += ide
cf50: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
cf60: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
cf70: 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  { .    zSep = ""
cf80: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
cf90: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
cfa0: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
cfb0: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
cfc0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
cfd0: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
cfe0: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
cff0: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
d000: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
d010: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
d020: 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74   n);.  if( zStmt
d030: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
d040: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
d050: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d060: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
d070: 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22  intf(n, zStmt, "
d080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
d090: 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74  .  k = sqlite3St
d0a0: 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20  rlen30(zStmt);. 
d0b0: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
d0c0: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
d0d0: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
d0e0: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
d0f0: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
d100: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
d110: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63  l++){.    static
d120: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
d130: 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b  nst azType[] = {
d140: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
d150: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a  TE_AFF_BLOB    *
d160: 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  / "",.        /*
d170: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
d180: 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a      */ " TEXT",.
d190: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
d1a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f  E_AFF_NUMERIC */
d1b0: 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20   " NUM",.       
d1c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   /* SQLITE_AFF_I
d1d0: 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22  NTEGER */ " INT"
d1e0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d1f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
d200: 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d  */ " REAL".    }
d210: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
d220: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d230: 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Type;..    sqlit
d240: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
d250: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70   &zStmt[k], zSep
d260: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
d270: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74  te3Strlen30(&zSt
d280: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
d290: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
d2a0: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
d2b0: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
d2c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
d2d0: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
d2e0: 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20  E_AFF_BLOB >= 0 
d2f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d300: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
d310: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20  LITE_AFF_BLOB < 
d320: 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65  ArraySize(azType
d330: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
d340: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
d350: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  y==SQLITE_AFF_BL
d360: 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  OB );.    testca
d370: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
d380: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
d390: 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  EXT );.    testc
d3a0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
d3b0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d3c0: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
d3d0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
d3e0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d3f0: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
d400: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
d410: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
d420: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
d430: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
d440: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
d450: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
d460: 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c  AFF_BLOB];.    l
d470: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
d480: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
d490: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
d4a0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
d4b0: 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20  AFF_BLOB .      
d4c0: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
d4d0: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
d4e0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
d4f0: 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65  pe, 0) );.    me
d500: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
d510: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
d520: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
d530: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
d540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
d550: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
d560: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
d570: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
d580: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69  t;.}../*.** Resi
d590: 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ze an Index obje
d5a0: 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c  ct to hold N col
d5b0: 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74  umns total.  Ret
d5c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
d5d0: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
d5e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20  SQLITE_NOMEM on 
d5f0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f  an OOM error..*/
d600: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69  .static int resi
d610: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71  zeIndexObject(sq
d620: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
d630: 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a   *pIdx, int N){.
d640: 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
d650: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
d660: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
d670: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=N ) return SQL
d680: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
d690: 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65  ( pIdx->isResize
d6a0: 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20  d==0 );.  nByte 
d6b0: 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  = (sizeof(char*)
d6c0: 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b   + sizeof(i16) +
d6d0: 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20   1)*N;.  zExtra 
d6e0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
d6f0: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
d700: 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d  ;.  if( zExtra==
d710: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
d720: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
d730: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d740: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
d750: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
d760: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d770: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  x->azColl = (con
d780: 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  st char**)zExtra
d790: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
d7a0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
d7b0: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
d7c0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
d7d0: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
d7e0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
d7f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
d800: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
d810: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
d820: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
d830: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d840: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
d850: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d860: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
d870: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
d880: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
d890: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
d8a0: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
d8b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d8c0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d8d0: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
d8e0: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
d8f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d900: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
d910: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
d920: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
d930: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
d940: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
d950: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d960: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
d970: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
d980: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
d990: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
d9a0: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
d9b0: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
d9c0: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
d9d0: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
d9e0: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
d9f0: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
da00: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
da10: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
da20: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
da30: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
da40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
da50: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
da60: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
da70: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
da80: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
da90: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
daa0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
dab0: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
dac0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
dad0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
dae0: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
daf0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
db00: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
db10: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
db20: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
db30: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
db40: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
db50: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
db60: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
db70: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
db80: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
db90: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
dba0: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
dbb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
dbc0: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
dbd0: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
dbe0: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
dbf0: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
dc00: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
dc10: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
dc20: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
dc30: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
dc40: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
dc50: 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75 74 65  .}../* Recompute
dc60: 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64   the colNotIdxed
dc70: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 49 6e   field of the In
dc80: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f  dex..**.** colNo
dc90: 74 49 64 78 65 64 20 69 73 20 61 20 62 69 74 6d  tIdxed is a bitm
dca0: 61 73 6b 20 74 68 61 74 20 68 61 73 20 61 20 30  ask that has a 0
dcb0: 20 62 69 74 20 72 65 70 72 65 73 65 6e 74 69 6e   bit representin
dcc0: 67 20 65 61 63 68 20 69 6e 64 65 78 65 64 0a 2a  g each indexed.*
dcd0: 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  * columns that a
dce0: 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  re within the fi
dcf0: 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f  rst 63 columns o
dd00: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
dd10: 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65 72 20  e.** high-order 
dd20: 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49 64 78  bit of colNotIdx
dd30: 65 64 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20  ed is always 1. 
dd40: 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64 20 63   All unindexed c
dd50: 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
dd60: 20 74 61 62 6c 65 20 68 61 76 65 20 61 20 31 2e   table have a 1.
dd70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 4e 6f  .**.** The colNo
dd80: 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73 20 41  tIdxed mask is A
dd90: 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65 20 53  ND-ed with the S
dda0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
ddb0: 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20 64 65  ed mask.** to de
ddc0: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 69  termine if the i
ddd0: 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69 6e 67  ndex is covering
dde0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
ddf0: 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75 74 65  c void recompute
de00: 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65  ColumnsNotIndexe
de10: 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  d(Index *pIdx){.
de20: 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
de30: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
de40: 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
de50: 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
de60: 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
de70: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
de80: 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
de90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
dea0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
deb0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
dec0: 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
ded0: 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
dee0: 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
def0: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63 6f 6c  .  }.  pIdx->col
df00: 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b 0a 20  NotIdxed = ~m;. 
df10: 20 61 73 73 65 72 74 28 20 28 70 49 64 78 2d 3e   assert( (pIdx->
df20: 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36 33 29  colNotIdxed>>63)
df30: 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==1 );.}../*.** 
df40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
df50: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
df60: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
df70: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
df80: 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57   that.** has a W
df90: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61  ITHOUT ROWID cla
dfa0: 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66  use.  The job of
dfb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
dfc0: 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68   to convert both
dfd0: 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  .** internal sch
dfe0: 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75  ema data structu
dff0: 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65  res and the gene
e000: 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20  rated VDBE code 
e010: 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20  so that they.** 
e020: 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  are appropriate 
e030: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
e040: 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61  WID table instea
e050: 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62  d of a rowid tab
e060: 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69  le..** Changes i
e070: 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  nclude:.**.**   
e080: 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63    (1)  Set all c
e090: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
e0a0: 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61  IMARY KEY schema
e0b0: 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f   object to be NO
e0c0: 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28  T NULL..**     (
e0d0: 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70  2)  Convert P3 p
e0e0: 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20  arameter of the 
e0f0: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 66  OP_CreateBtree f
e100: 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59  rom BTREE_INTKEY
e110: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e   .**          in
e120: 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59  to BTREE_BLOBKEY
e130: 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79  ..**     (3)  By
e140: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f  pass the creatio
e150: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n of the sqlite_
e160: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
e170: 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ry.**          f
e180: 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  or the PRIMARY K
e190: 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72  EY as the primar
e1a0: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
e1b0: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
e1c0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
e1d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
e1e0: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
e1f0: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
e200: 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20  **     (4)  Set 
e210: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
e220: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
e230: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
e240: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
e250: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
e260: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
e270: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
e280: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
e290: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
e2a0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
e2b0: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
e2c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
e2d0: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
e2e0: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
e2f0: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
e300: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
e310: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
e320: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41  rt of KeyInfo.nA
e330: 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  llField and are 
e340: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
e350: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
e360: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
e370: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
e380: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
e390: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
e3a0: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
e3b0: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
e3c0: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
e3d0: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
e3e0: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
e3f0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  EY columns..**.*
e400: 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * For virtual ta
e410: 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69  bles, only (1) i
e420: 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s performed..*/.
e430: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
e440: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
e450: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
e460: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
e470: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
e480: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
e490: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
e4a0: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
e4b0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e4c0: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
e4d0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
e4e0: 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20    /* Mark every 
e4f0: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
e500: 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28  mn as NOT NULL (
e510: 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73  except for impos
e520: 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f  ter tables).  */
e530: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
e540: 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29  .imposterTable )
e550: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
e560: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e570: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  ){.      if( (pT
e580: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
e590: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50  lags & COLFLAG_P
e5a0: 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20  RIMKEY)!=0 ){.  
e5b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
e5c0: 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45  [i].notNull = OE
e5d0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
e5e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e5f0: 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f  Convert the P3 o
e600: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50  perand of the OP
e610: 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63  _CreateBtree opc
e620: 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49  ode from BTREE_I
e630: 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20  NTKEY.  ** into 
e640: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20  BTREE_BLOBKEY.. 
e650: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
e660: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
e670: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
e680: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e690: 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73  hangeP3(v, pPars
e6a0: 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54  e->addrCrTab, BT
e6b0: 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20  REE_BLOBKEY);.  
e6c0: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
e6d0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
e6e0: 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68  ndex.  Or, if th
e6f0: 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69  is table was ori
e700: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20  ginally.  ** an 
e710: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
e720: 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74  KEY table, creat
e730: 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20  e a new PRIMARY 
e740: 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f  KEY index. .  */
e750: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
e760: 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  ey>=0 ){.    Exp
e770: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
e780: 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e    Token ipkToken
e790: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
e7a0: 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e  enInit(&ipkToken
e7b0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61  , pTab->aCol[pTa
e7c0: 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
e7d0: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
e7e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
e7f0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a  end(pParse, 0, .
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
e820: 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69  oc(db, TK_ID, &i
e830: 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  pkToken, 0));.  
e840: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e850: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69   return;.    pLi
e860: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
e870: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
e880: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
e890: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
e8a0: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
e8b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  ;.    sqlite3Cre
e8c0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
e8d0: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
e8e0: 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20   pTab->keyConf, 
e8f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20  0, 0, 0, 0,.    
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e910: 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50     SQLITE_IDXTYP
e920: 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20  E_PRIMARYKEY);. 
e930: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
e940: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
e950: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
e960: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
e970: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
e980: 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54  ex(pTab);.    pT
e990: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
e9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
e9b0: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
e9c0: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
e9d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
e9e0: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e  Remove all redun
e9f0: 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  dant columns fro
ea00: 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  m the PRIMARY KE
ea10: 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  Y.  For example,
ea20: 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22   change.    ** "
ea30: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
ea40: 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e  a,b,c,b,c,d)" in
ea50: 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59  to just "PRIMARY
ea60: 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20   KEY(a,b,c,d)". 
ea70: 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f   Later.    ** co
ea80: 64 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50  de assumes the P
ea90: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61  RIMARY KEY conta
eaa0: 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20  ins no repeated 
eab0: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a  columns..    */.
eac0: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69      for(i=j=1; i
ead0: 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  <pPk->nKeyCol; i
eae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
eaf0: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
eb00: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e  Column, j, pPk->
eb10: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
eb20: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f          pPk->nCo
eb30: 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  lumn--;.      }e
eb40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b  lse{.        pPk
eb50: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20  ->aiColumn[j++] 
eb60: 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  = pPk->aiColumn[
eb70: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
eb80: 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43  }.    pPk->nKeyC
eb90: 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73  ol = j;.  }.  as
eba0: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
ebb0: 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e    pPk->isCoverin
ebc0: 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62  g = 1;.  if( !db
ebd0: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54  ->init.imposterT
ebe0: 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71  able ) pPk->uniq
ebf0: 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e  NotNull = 1;.  n
ec00: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
ec10: 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20  l;..  /* Bypass 
ec20: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
ec30: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
ec40: 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71  btree and the sq
ec50: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
ec60: 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68   table entry. Th
ec70: 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  is is only requi
ec80: 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79  red if currently
ec90: 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45   generating VDBE
eca0: 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61  .  ** code for a
ecb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e   CREATE TABLE (n
ecc0: 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ot when parsing 
ecd0: 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72  one as part of r
ece0: 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61  eading.  ** a da
ecf0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20  tabase schema). 
ed00: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70   */.  if( v && p
ed10: 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20  Pk->tnum>0 ){.  
ed20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
ed30: 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
ed40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ed50: 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b  ngeOpcode(v, pPk
ed60: 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29  ->tnum, OP_Goto)
ed70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
ed80: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
ed90: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
eda0: 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  the table root p
edb0: 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e  age */.  pPk->tn
edc0: 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  um = pTab->tnum;
edd0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
ede0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
edf0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  esentation of al
ee00: 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73  l UNIQUE indices
ee10: 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20   by converting. 
ee20: 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   ** the final ro
ee30: 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20  wid column into 
ee40: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  one or more colu
ee50: 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41  mns of the PRIMA
ee60: 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66  RY KEY..  */.  f
ee70: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
ee80: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
ee90: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
eea0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
eeb0: 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  ( IsPrimaryKeyIn
eec0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
eed0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
eee0: 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  n=0; i<nPk; i++)
eef0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
ef00: 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43  Column(pIdx->aiC
ef10: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65  olumn, pIdx->nKe
ef20: 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  yCol, pPk->aiCol
ef30: 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20  umn[i]) ) n++;. 
ef40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d     }.    if( n==
ef50: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
ef60: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75  is index is a su
ef70: 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72  perset of the pr
ef80: 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20  imary key */.   
ef90: 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
efa0: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
efb0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
efc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
efd0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
efe0: 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78  t(db, pIdx, pIdx
eff0: 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72  ->nKeyCol+n) ) r
f000: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
f010: 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79  =0, j=pIdx->nKey
f020: 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  Col; i<nPk; i++)
f030: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
f040: 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43  Column(pIdx->aiC
f050: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65  olumn, pIdx->nKe
f060: 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  yCol, pPk->aiCol
f070: 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  umn[i]) ){.     
f080: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
f090: 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  n[j] = pPk->aiCo
f0a0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
f0b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
f0c0: 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69   = pPk->azColl[i
f0d0: 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ];.        j++;.
f0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f0f0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f100: 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e  nColumn>=pIdx->n
f110: 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20  KeyCol+n );.    
f120: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
f130: 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a  olumn>=j );.  }.
f140: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61  .  /* Add all ta
f150: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
f160: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
f170: 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ndex.  */.  if( 
f180: 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  nPk<pTab->nCol )
f190: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  {.    if( resize
f1a0: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
f1b0: 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  pPk, pTab->nCol)
f1c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
f1d0: 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69  or(i=0, j=nPk; i
f1e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
f1f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
f200: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
f210: 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a  olumn, j, i) ){.
f220: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f230: 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  j<pPk->nColumn )
f240: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
f250: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a  iColumn[j] = i;.
f260: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43          pPk->azC
f270: 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33  oll[j] = sqlite3
f280: 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
f290: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     j++;.      }.
f2a0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f2b0: 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  ( pPk->nColumn==
f2c0: 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j );.    assert(
f2d0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29   pTab->nCol==j )
f2e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f2f0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54  Pk->nColumn = pT
f300: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20  ab->nCol;.  }.  
f310: 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73  recomputeColumns
f320: 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b  NotIndexed(pPk);
f330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
f340: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
f350: 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
f360: 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
f370: 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
f380: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
f390: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
f3a0: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
f3b0: 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
f3c0: 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
f3d0: 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
f3e0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
f3f0: 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
f400: 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
f410: 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
f420: 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
f430: 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
f440: 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
f450: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
f460: 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
f470: 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
f480: 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
f490: 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
f4a0: 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
f4b0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
f4c0: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
f4d0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
f4e0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f4f0: 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
f500: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
f510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
f520: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
f530: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
f540: 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
f550: 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65   changed, so the
f560: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
f570: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
f580: 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
f590: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
f5a0: 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
f5b0: 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
f5c0: 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
f5d0: 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
f5e0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
f5f0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
f600: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
f610: 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
f620: 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
f630: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
f640: 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
f650: 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
f660: 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
f670: 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
f680: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
f690: 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
f6a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
f6b0: 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
f6c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
f6d0: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
f6e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
f6f0: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
f700: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  t */.  Token *pC
f710: 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ons,           /
f720: 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20  * The ',' token 
f730: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63  after the last c
f740: 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20  olumn defn. */. 
f750: 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
f760: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f770: 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f  ')' before optio
f780: 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  ns in the CREATE
f790: 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74   TABLE */.  u8 t
f7a0: 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20  abOpts,         
f7b0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62      /* Extra tab
f7c0: 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61  le options. Usua
f7d0: 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65  lly 0. */.  Sele
f7e0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
f7f0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
f800: 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
f810: 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
f820: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20  {.  Table *p;   
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f840: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   The new table *
f850: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
f860: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
f870: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
f880: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
f890: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
f8a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
f8b0: 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65  ase in which the
f8c0: 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a   table lives */.
f8d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f8f0: 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
f900: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
f910: 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26  .  if( pEnd==0 &
f920: 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  & pSelect==0 ){.
f930: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
f940: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
f950: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
f960: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
f970: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
f980: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
f990: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
f9a0: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
f9b0: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
f9c0: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
f9d0: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
f9e0: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
f9f0: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
fa00: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
fa10: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
fa20: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
fa30: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
fa40: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
fa50: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
fa60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
fa70: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
fa80: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
fa90: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
faa0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
fab0: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
fac0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
fad0: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
fae0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
faf0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fb00: 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
fb10: 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
fb20: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
fb30: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
fb40: 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
fb50: 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
fb60: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
fb70: 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  {.    if( pSelec
fb80: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
fb90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fba0: 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  e, "");.      re
fbb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
fbc0: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
fbd0: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
fbe0: 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
fbf0: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
fc00: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
fc10: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
fc20: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
fc30: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
fc40: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
fc50: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
fc60: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
fc70: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
fc80: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
fc90: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
fca0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fcb0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
fcc0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
fcd0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
fce0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
fcf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
fd00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
fd10: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
fd20: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
fd30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
fd40: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fd50: 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
fd60: 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
fd70: 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
fd80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fd90: 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
fda0: 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
fdb0: 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
fdc0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
fdd0: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
fde0: 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
fdf0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
fe00: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
fe10: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
fe20: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
fe30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fe40: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
fe50: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
fe60: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
fe70: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
fe80: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
fe90: 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
fea0: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
feb0: 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
fec0: 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
fed0: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
fee0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
fef0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ff00: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
ff10: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
ff20: 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
ff30: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
ff40: 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
ff50: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
ff60: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
ff70: 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
ff80: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
ff90: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
ffa0: 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
ffb0: 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
ffc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
ffd0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
ffe0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
fff0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
10000 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
10010 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10020 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
10030 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
10040 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
10050 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
10060 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
10070 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
10080 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
10090 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
100a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
100b0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
100c0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
100d0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
100e0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
100f0 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
10100 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
10110 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
10120 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
10130 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
10140 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
10150 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
10160 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
10170 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
10180 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
10190 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
101a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
101b0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
101c0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
101d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
101e0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
101f0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
10200 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
10210 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
10220 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
10230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10240 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
10250 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
10260 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
10270 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
10280 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
10290 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
102a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
102b0 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
102c0 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
102d0 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
102e0 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
102f0 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
10300 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
10310 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10320 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
10330 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
10340 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
10350 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
10360 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
10370 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
10380 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
10390 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
103a0 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
103b0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
103c0 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
103d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
103e0 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
103f0 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
10400 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
10410 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
10420 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
10430 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
10440 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
10450 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
10460 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
10470 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
10480 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
10490 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
104a0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
104b0 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
104c0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
104d0 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
104e0 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
104f0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
10500 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
10510 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
10520 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
10530 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
10540 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
10550 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
10560 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
10570 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
10580 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
10590 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
105a0 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
105b0 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
105c0 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
105d0 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
105e0 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
105f0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
10600 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
10610 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
10620 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
10630 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
10640 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
10650 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
10660 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
10670 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
10680 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
10690 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
106a0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
106b0 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
106c0 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
106d0 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
106e0 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
106f0 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
10700 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10710 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
10720 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
10730 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
10740 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
10750 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
10760 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
10770 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
10780 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10790 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
107a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
107b0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
107c0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
107d0 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
107e0 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
107f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10800 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
10810 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10820 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10830 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
10840 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
10850 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10860 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10870 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
10880 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
10890 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
108a0 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
108b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
108c0 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
108d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
108e0 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
108f0 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
10900 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
10910 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10920 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
10930 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
10940 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10950 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
10960 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
10970 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
10980 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61   return;.      a
10990 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
109a0 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  0 );.      p->nC
109b0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
109c0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
109d0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
109e0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
109f0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10a00 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
10a10 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10a20 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10a30 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
10a40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10a50 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
10a60 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
10a70 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
10a80 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10a90 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
10aa0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
10ab0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
10ac0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
10ad0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
10ae0 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
10af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10b10 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
10b20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
10b30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10b40 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
10b50 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
10b60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10b70 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
10b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10b90 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10ba0 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10bb0 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10bd0 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10be0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10c00 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10c10 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10c30 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
10c40 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
10c50 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10c60 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
10c70 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c90 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10ca0 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
10cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10cc0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
10cd0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
10ce0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
10cf0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
10d00 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
10d10 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
10d20 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
10d30 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
10d40 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
10d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10d60 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
10d70 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
10d80 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
10d90 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
10da0 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
10db0 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
10dc0 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
10dd0 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
10de0 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
10df0 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
10e00 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10e10 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
10e20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
10e30 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
10e40 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
10e50 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
10e60 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
10e70 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
10e80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10e90 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
10ea0 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
10eb0 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
10ec0 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
10ed0 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
10ee0 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
10ef0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
10f00 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
10f10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
10f20 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10f30 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
10f40 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
10f50 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
10f60 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
10f70 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
10f80 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
10f90 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
10fa0 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
10fb0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
10fc0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
10fd0 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
10fe0 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
10ff0 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
11000 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
11010 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
11020 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
11030 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
11040 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
11050 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
11060 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
11070 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
11080 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
11090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
110a0 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
110b0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
110c0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
110d0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
110e0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
110f0 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
11100 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
11110 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
11120 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
11130 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11140 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
11150 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
11160 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
11170 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
11180 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11190 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
111a0 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
111b0 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
111c0 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
111d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
111e0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
111f0 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11200 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
11210 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
11220 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
11230 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
11240 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
11250 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
11260 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
11270 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
11280 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11290 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
112a0 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
112b0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
112c0 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 69 44 62  maOp(pParse, iDb
112d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
112e0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
112f0 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41  "tbl_name='%q' A
11300 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  ND type!='trigge
11310 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b  r'", p->zName));
11320 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20  .  }...  /* Add 
11330 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  the table to the
11340 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
11350 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
11360 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
11370 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
11380 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  usy ){.    Table
11390 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
113a0 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
113b0 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73  >pSchema;.    as
113c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
113d0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
113e0 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
113f0 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61  pOld = sqlite3Ha
11400 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d  shInsert(&pSchem
11410 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a  a->tblHash, p->z
11420 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  Name, p);.    if
11430 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  ( pOld ){.      
11440 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20  assert( p==pOld 
11450 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
11460 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69  st have failed i
11470 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74  nside HashInsert
11480 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  () */.      sqli
11490 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
114a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
114b0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
114c0 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a  >pNewTable = 0;.
114d0 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73      db->mDbFlags
114e0 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
114f0 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65  aChange;..#ifnde
11500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
11510 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
11520 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
11530 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
11540 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
11550 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
11560 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
11570 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
11580 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
11590 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
115a0 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
115b0 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
115c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
115d0 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
115e0 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
115f0 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
11600 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
11610 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
11620 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
11630 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
11640 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
11650 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
11660 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
11670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11680 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
11690 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
116a0 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
116b0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
116c0 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
116d0 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
116e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
116f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
11700 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
11710 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
11720 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
11730 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
11740 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
11750 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11760 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
11770 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
11780 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11790 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
117a0 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
117b0 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
117c0 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
117d0 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
117e0 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65  ExprList *pCName
117f0 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c  s, /* Optional l
11800 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75  ist of view colu
11810 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65  mn names */.  Se
11820 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
11830 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61   /* A SELECT sta
11840 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c  tement that will
11850 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
11860 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
11870 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
11880 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f  TRUE for a TEMPO
11890 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69  RARY view */.  i
118a0 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20  nt noErr        
118b0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72    /* Suppress er
118c0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20  ror messages if 
118d0 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69  VIEW already exi
118e0 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
118f0 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  e *p;.  int n;. 
11900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
11910 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
11920 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
11930 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
11940 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
11950 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
11960 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
11970 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29  pParse->nVar>0 )
11980 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
11990 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70  orMsg(pParse, "p
119a0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f  arameters are no
119b0 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65  t allowed in vie
119c0 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63  ws");.    goto c
119d0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b  reate_view_fail;
119e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
119f0 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
11a00 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
11a10 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
11a20 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
11a30 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
11a40 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
11a50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
11a60 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61  o create_view_fa
11a70 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f  il;.  sqlite3Two
11a80 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
11a90 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
11aa0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
11ab0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11ac0 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
11ad0 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
11ae0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
11af0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69  pParse, iDb, "vi
11b00 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  ew", pName);.  i
11b10 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
11b20 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65  ect(&sFix, pSele
11b30 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74  ct) ) goto creat
11b40 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
11b50 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
11b60 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
11b70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
11b80 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
11b90 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
11ba0 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
11bb0 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
11bc0 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
11bd0 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
11be0 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
11bf0 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
11c00 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
11c10 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
11c20 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
11c30 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
11c40 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
11c50 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
11c60 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  urns..  */.  if(
11c70 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
11c80 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c  T ){.    p->pSel
11c90 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
11ca0 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a     pSelect = 0;.
11cb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
11cc0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
11cd0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
11ce0 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
11cf0 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70  REDUCE);.  }.  p
11d00 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74  ->pCheck = sqlit
11d10 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
11d20 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44  , pCNames, EXPRD
11d30 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66  UP_REDUCE);.  if
11d40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
11d50 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  ed ) goto create
11d60 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f  _view_fail;..  /
11d70 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64  * Locate the end
11d80 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56   of the CREATE V
11d90 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  IEW statement.  
11da0 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20  Make sEnd point 
11db0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e  to.  ** the end.
11dc0 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70  .  */.  sEnd = p
11dd0 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
11de0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e  n;.  assert( sEn
11df0 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e  d.z[0]!=0 || sEn
11e00 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  d.n==0 );.  if( 
11e10 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
11e20 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
11e30 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
11e40 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
11e50 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
11e60 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
11e70 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
11e80 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
11e90 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
11ea0 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
11eb0 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
11ec0 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
11ed0 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
11ee0 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
11ef0 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
11f00 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
11f10 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
11f20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
11f30 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
11f40 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
11f50 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
11f60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11f70 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
11f80 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  ct);.  if( IN_RE
11f90 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
11fa0 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65     sqlite3Rename
11fb0 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28 70 50  ExprlistUnmap(pP
11fc0 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29 3b 0a  arse, pCNames);.
11fd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
11fe0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11ff0 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 75  pCNames);.  retu
12000 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
12010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12020 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
12030 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
12040 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
12050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12060 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
12070 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
12080 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
12090 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
120a0 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
120b0 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
120c0 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
120d0 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
120e0 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
120f0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
12100 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
12110 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
12120 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
12130 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
12140 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
12150 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
12160 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
12170 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
12180 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
12190 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
121a0 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
121b0 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
121c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
121d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
121e0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
121f0 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
12200 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
12210 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
12220 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
12230 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
12240 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
12250 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
12260 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
12270 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
12280 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
12290 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
122a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
122b0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
122c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
122d0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
122e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
122f0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12300 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e 64  E.  int rc;.#end
12310 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
12320 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
12330 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 78  TION.  sqlite3_x
12340 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 20  auth xAuth;     
12350 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 68    /* Saved xAuth
12360 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e 64   pointer */.#end
12370 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  if..  assert( pT
12380 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
12390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
123a0 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d 3e  TUALTABLE.  db->
123b0 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20  nSchemaLock++;. 
123c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
123d0 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
123e0 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  rse, pTable);.  
123f0 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2d  db->nSchemaLock-
12400 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  -;.  if( rc ){. 
12410 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12420 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
12430 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
12440 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
12450 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12460 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
12470 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
12480 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
12490 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
124a0 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
124b0 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
124c0 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
124d0 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
124e0 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
124f0 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
12500 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
12510 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
12520 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
12530 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
12540 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
12550 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
12560 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
12570 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
12580 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
12590 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
125a0 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
125b0 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
125c0 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
125d0 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
125e0 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
125f0 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
12600 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
12610 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
12620 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
12630 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69  he error above i
12640 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
12650 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
12660 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
12670 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  But the followin
12680 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20  g test is still 
12690 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20  important as it 
126a0 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a  does come up.  *
126b0 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
126c0 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  ng:.  ** .  **  
126d0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
126e0 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a  main.ex1(a);.  *
126f0 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  *     CREATE TEM
12700 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45  P VIEW ex1 AS SE
12710 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b  LECT a FROM ex1;
12720 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
12730 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31   * FROM temp.ex1
12740 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ;.  */.  if( pTa
12750 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
12760 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12770 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
12780 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
12790 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
127a0 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
127b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
127c0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
127d0 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
127e0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
127f0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
12800 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
12810 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
12820 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
12830 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
12840 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12850 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
12860 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
12870 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
12880 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
12890 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
128a0 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
128b0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
128c0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
128d0 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
128e0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
128f0 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
12900 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
12910 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
12920 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
12930 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
12940 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
12950 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
12960 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
12970 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
12980 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
12990 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
129a0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
129b0 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
129c0 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 23  .  if( pSel ){.#
129d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
129e0 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
129f0 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64 65 20    u8 eParseMode 
12a00 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72 73 65  = pParse->eParse
12a10 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65  Mode;.    pParse
12a20 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 50  ->eParseMode = P
12a30 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  ARSE_MODE_NORMAL
12a40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 20 3d  ;.#endif.    n =
12a50 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
12a60 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
12a70 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
12a80 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
12a90 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
12aa0 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64  nCol = -1;.    d
12ab0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
12ac0 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66  sable++;.#ifndef
12ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12ae0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
12af0 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
12b00 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
12b10 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
12b20 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
12b30 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
12b40 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
12b50 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
12b60 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
12b70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
12b80 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
12b90 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
12ba0 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73 65 2d  ndif.    pParse-
12bb0 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
12bc0 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  f( pTable->pChec
12bd0 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 52  k ){.      /* CR
12be0 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 28 61  EATE VIEW name(a
12bf0 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e 0a 20  rglist) AS .... 
12c00 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61 6d 65       ** The name
12c10 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
12c20 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 61 72   in the table ar
12c30 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20 20 20  e taken from.   
12c40 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20 77 68     ** arglist wh
12c50 69 63 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ich is stored in
12c60 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2e   pTable->pCheck.
12c70 20 20 54 68 65 20 70 43 68 65 63 6b 20 66 69 65    The pCheck fie
12c80 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 72 6d  ld.      ** norm
12c90 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45 43 4b  ally holds CHECK
12ca0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
12cb0 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  an ordinary tabl
12cc0 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20 20 20  e, but for.     
12cd0 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20 68 6f   ** a VIEW it ho
12ce0 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lds the list of 
12cf0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20 20  column names..  
12d00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
12d10 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
12d20 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
12d30 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20  pTable->pCheck, 
12d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 2c    &pTable->nCol,
12d70 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b   &pTable->aCol);
12d80 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
12d90 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 0a  allocFailed==0 .
12da0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73 65         && pParse
12db0 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20 20 20  ->nErr==0.      
12dc0 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   && pTable->nCol
12dd0 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2d 3e  ==pSel->pEList->
12de0 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
12df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
12e00 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
12e10 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
12e20 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20 70 53  arse, pTable, pS
12e30 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
12e40 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 6c 54   }else if( pSelT
12e50 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  ab ){.      /* C
12e60 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65 20  REATE VIEW name 
12e70 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74 20 61  AS...  without a
12e80 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e  n argument list.
12e90 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20 20 20    Construct.    
12ea0 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20    ** the column 
12eb0 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 53  names from the S
12ec0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12ed0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
12ee0 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a 2f 0a   view..      */.
12ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
12f00 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  able->aCol==0 );
12f10 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
12f20 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
12f30 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  Col;.      pTabl
12f40 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->aCol = pSelTa
12f50 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->aCol;.      p
12f60 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30  SelTab->nCol = 0
12f70 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
12f80 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
12f90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12fa0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
12fb0 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70  db, 0, pTable->p
12fc0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 7d  Schema) );.    }
12fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
12fe0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
12ff0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
13000 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  }.    sqlite3Del
13010 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
13020 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  lTab);.    sqlit
13030 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
13040 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62  b, pSel);.    db
13050 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
13060 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65 66 20  able--;.#ifndef 
13070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
13080 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61 72 73  RTABLE.    pPars
13090 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20  e->eParseMode = 
130a0 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65 6e 64  eParseMode;.#end
130b0 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  if.  } else {.  
130c0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20    nErr++;.  }.  
130d0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
130e0 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
130f0 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
13100 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13110 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
13120 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
13130 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
13140 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  le);.    pTable-
13150 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70  >aCol = 0;.    p
13160 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
13170 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
13180 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
13190 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72  */.  return nErr
131a0 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
131b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
131c0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
131d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
131e0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
131f0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
13200 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
13210 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
13220 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
13230 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64 61  every VIEW in da
13240 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73  tabase idx..*/.s
13250 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
13260 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71  eViewResetAll(sq
13270 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
13280 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  dx){.  HashElem 
13290 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *i;.  assert( sq
132a0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
132b0 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29  Held(db, idx, 0)
132c0 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73   );.  if( !DbHas
132d0 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
132e0 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
132f0 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  s) ) return;.  f
13300 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
13310 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64  irst(&db->aDb[id
13320 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  x].pSchema->tblH
13330 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65  ash); i;i=sqlite
13340 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
13350 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13360 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
13370 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
13380 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
13390 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43    sqlite3DeleteC
133a0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
133b0 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
133c0 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
133d0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30    pTab->nCol = 0
133e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
133f0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
13400 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
13410 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
13420 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
13430 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
13440 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
13450 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
13460 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13470 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
13480 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
13490 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
134a0 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
134b0 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
134c0 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
134d0 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
134e0 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
134f0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
13500 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
13510 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
13520 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
13530 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
13540 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
13550 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
13560 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
13570 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
13580 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
13590 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
135a0 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
135b0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
135c0 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
135d0 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
135e0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
135f0 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
13600 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
13610 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
13620 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
13630 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
13640 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
13650 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
13660 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
13670 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
13680 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
13690 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
136a0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
136b0 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
136c0 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
136d0 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
136e0 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
136f0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
13700 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
13710 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
13720 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
13730 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
13740 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
13750 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
13760 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
13770 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
13780 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
13790 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
137a0 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
137b0 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
137c0 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
137d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
137e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
137f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
13800 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74  tPageMoved(sqlit
13810 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
13820 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
13830 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
13840 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
13850 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44  *pHash;.  Db *pD
13860 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  b;..  assert( sq
13870 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
13880 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
13890 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
138a0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61  >aDb[iDb];.  pHa
138b0 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
138c0 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
138d0 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
138e0 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
138f0 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
13900 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
13910 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
13920 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
13930 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
13940 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
13950 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
13960 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
13970 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
13980 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
13990 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
139a0 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
139b0 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
139c0 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
139d0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
139e0 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
139f0 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
13a00 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
13a10 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
13a20 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
13a30 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
13a40 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
13a50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13a60 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
13a70 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
13a80 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
13a90 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
13aa0 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
13ab0 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
13ac0 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
13ad0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
13ae0 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
13af0 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
13b00 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
13b10 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
13b20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
13b30 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
13b40 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
13b50 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
13b60 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
13b70 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
13b80 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
13b90 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
13ba0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
13bb0 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
13bc0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
13bd0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13be0 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
13bf0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
13c00 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 69 54  Parse);.  if( iT
13c10 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74 65 33  able<2 ) sqlite3
13c20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13c30 20 22 63 6f 72 72 75 70 74 20 73 63 68 65 6d 61   "corrupt schema
13c40 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ");.  sqlite3Vdb
13c50 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
13c60 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
13c70 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  1, iDb);.  sqlit
13c80 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
13c90 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
13ca0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13cb0 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72  UM.  /* OP_Destr
13cc0 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20  oy stores an in 
13cd0 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74  integer r1. If t
13ce0 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  his integer.  **
13cf0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
13d00 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f  en it is the roo
13d10 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
13d20 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74   a table moved t
13d30 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20  o.  ** location 
13d40 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  iTable. The foll
13d50 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66  owing code modif
13d60 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ies the sqlite_m
13d70 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20  aster table to. 
13d80 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73   ** reflect this
13d90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
13da0 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51  "#NNN" in the SQ
13db0 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63  L is a special c
13dc0 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61  onstant that mea
13dd0 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75  ns whatever valu
13de0 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67  e.  ** is in reg
13df0 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20  ister NNN.  See 
13e00 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73  grammar rules as
13e10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13e20 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  e TK_REGISTER.  
13e30 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64  ** token for add
13e40 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13e50 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ion..  */.  sqli
13e60 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13e70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50  Parse, .     "UP
13e80 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72  DATE %Q.%s SET r
13e90 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45  ootpage=%d WHERE
13ea0 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67   #%d AND rootpag
13eb0 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61  e=#%d",.     pPa
13ec0 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
13ed0 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
13ee0 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c  ER_NAME, iTable,
13ef0 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66   r1, r1);.#endif
13f00 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
13f10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13f20 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   r1);.}../*.** W
13f30 72 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rite VDBE code t
13f40 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54  o erase table pT
13f50 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63  ab and all assoc
13f60 69 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e  iated indices on
13f70 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74   disk..** Code t
13f80 6f 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c  o update the sql
13f90 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
13fa0 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  s and internal s
13fb0 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e  chema definition
13fc0 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72  s.** in case a r
13fd0 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69  oot-page belongi
13fe0 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61  ng to another ta
13ff0 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
14000 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a  the btree layer.
14010 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64  ** is also added
14020 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
14030 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
14040 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
14050 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14060 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72  destroyTable(Par
14070 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
14080 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49  e *pTab){.  /* I
14090 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  f the database m
140a0 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75  ay be auto-vacuu
140b0 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51  m capable (if SQ
140c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
140d0 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  CUUM.  ** is not
140e0 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20   defined), then 
140f0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
14100 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72  to call OP_Destr
14110 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74  oy on the.  ** t
14120 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72  able and index r
14130 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64  oot-pages in ord
14140 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  er, starting wit
14150 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c  h the numericall
14160 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  y .  ** largest 
14170 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
14180 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
14190 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  s that none of t
141a0 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20  he root-pages.  
141b0 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79  ** to be destroy
141c0 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20  ed is relocated 
141d0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50  by an earlier OP
141e0 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69  _Destroy. i.e. i
141f0 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  f the.  ** follo
14200 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a  wing were coded:
14210 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65  .  **.  ** OP_De
14220 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e  stroy 4 0.  ** .
14230 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  ...  ** OP_Destr
14240 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a  oy 5 0.  **.  **
14250 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35   and root page 5
14260 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20   happened to be 
14270 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
14280 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20  -page number in 
14290 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
142a0 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67  e, then root pag
142b0 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76  e 5 would be mov
142c0 65 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20  ed to page 4 by 
142d0 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65  the .  ** "OP_De
142e0 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64  stroy 4 0" opcod
142f0 65 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  e. The subsequen
14300 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  t "OP_Destroy 5 
14310 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a  0" would hit.  *
14320 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61  * a free-list pa
14330 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69  ge..  */.  int i
14340 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  Tab = pTab->tnum
14350 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79  ;.  int iDestroy
14360 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ed = 0;..  while
14370 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ( 1 ){.    Index
14380 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20   *pIdx;.    int 
14390 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20  iLargest = 0;.. 
143a0 20 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65     if( iDestroye
143b0 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65  d==0 || iTab<iDe
143c0 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20  stroyed ){.     
143d0 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62   iLargest = iTab
143e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
143f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
14400 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
14410 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
14420 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64    int iIdx = pId
14430 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61  x->tnum;.      a
14440 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63  ssert( pIdx->pSc
14450 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
14460 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ema );.      if(
14470 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20   (iDestroyed==0 
14480 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f  || (iIdx<iDestro
14490 79 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c  yed)) && iIdx>iL
144a0 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20  argest ){.      
144b0 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64    iLargest = iId
144c0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
144d0 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73  .    if( iLarges
144e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
144f0 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  turn;.    }else{
14500 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
14510 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14520 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
14530 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
14540 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14550 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50  iDb>=0 && iDb<pP
14560 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b  arse->db->nDb );
14570 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f  .      destroyRo
14580 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69  otPage(pParse, i
14590 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20  Largest, iDb);. 
145a0 20 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20       iDestroyed 
145b0 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20  = iLargest;.    
145c0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
145d0 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
145e0 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
145f0 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
14600 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
14610 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
14620 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
14630 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
14640 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
14650 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
14660 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14670 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
14680 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
14690 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146b0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
146c0 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
146d0 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
146e0 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
146f0 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
14700 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
14710 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
14720 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
14730 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
14740 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
14750 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
14760 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
14770 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20   for(i=1; i<=4; 
14780 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  i++){.    char z
14790 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c  Tab[24];.    sql
147a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
147b0 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c  zeof(zTab),zTab,
147c0 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c  "sqlite_stat%d",
147d0 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  i);.    if( sqli
147e0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
147f0 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a  rse->db, zTab, z
14800 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  DbName) ){.     
14810 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
14820 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
14830 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
14840 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d   %Q.%s WHERE %s=
14850 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62  %Q",.        zDb
14860 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70  Name, zTab, zTyp
14870 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  e, zName.      )
14880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14890 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
148a0 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  de to drop a tab
148b0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
148c0 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
148d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
148e0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74  Table *pTab, int
148f0 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77   iDb, int isView
14900 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
14910 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
14920 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67  arse->db;.  Trig
14930 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20  ger *pTrigger;. 
14940 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
14950 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d  aDb[iDb];..  v =
14960 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14970 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
14980 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c  t( v!=0 );.  sql
14990 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
149a0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
149b0 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  1, iDb);..#ifnde
149c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
149d0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
149e0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
149f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
14a00 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
14a10 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e  VBegin);.  }.#en
14a20 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
14a30 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f  ll triggers asso
14a40 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
14a50 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
14a60 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69  ped. Code.  ** i
14a70 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
14a80 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
14a90 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
14aa0 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c   and/or.  ** sql
14ab0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
14ac0 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  if required..  *
14ad0 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73  /.  pTrigger = s
14ae0 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73  qlite3TriggerLis
14af0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  t(pParse, pTab);
14b00 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67  .  while( pTrigg
14b10 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  er ){.    assert
14b20 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68  ( pTrigger->pSch
14b30 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
14b40 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70  ma || .        p
14b50 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
14b60 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
14b70 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69  hema );.    sqli
14b80 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
14b90 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
14ba0 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65  er);.    pTrigge
14bb0 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e  r = pTrigger->pN
14bc0 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ext;.  }..#ifnde
14bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14be0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a  TOINCREMENT.  /*
14bf0 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
14c00 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
14c10 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
14c20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14c30 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  .  ** the table 
14c40 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54  being dropped. T
14c50 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f  his is done befo
14c60 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  re the table is 
14c70 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20  dropped.  ** at 
14c80 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c  the btree level,
14c90 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c   in case the sql
14ca0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
14cb0 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a  le needs to.  **
14cc0 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c   move as a resul
14cd0 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63  t of the drop (c
14ce0 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  an happen in aut
14cf0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a  o-vacuum mode)..
14d00 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d    */.  if( pTab-
14d10 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
14d20 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
14d30 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
14d40 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
14d50 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
14d60 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %Q.sqlite_sequ
14d70 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
14d80 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  %Q",.      pDb->
14d90 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  zDbSName, pTab->
14da0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
14db0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
14dc0 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
14dd0 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
14de0 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
14df0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
14e00 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
14e10 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
14e20 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
14e30 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
14e40 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
14e50 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
14e60 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
14e70 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
14e80 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
14e90 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
14ea0 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
14eb0 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63  d separately bec
14ec0 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
14ed0 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
14ee0 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
14ef0 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
14f00 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
14f10 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
14f20 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
14f30 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
14f40 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
14f50 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
14f60 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
14f70 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
14f80 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
14f90 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65     pDb->zDbSName
14fa0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70  , MASTER_NAME, p
14fb0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  Tab->zName);.  i
14fc0 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49  f( !isView && !I
14fd0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
14fe0 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62  {.    destroyTab
14ff0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
15000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
15010 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
15020 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
15030 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
15040 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a   and modify.  **
15050 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
15060 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ie..  */.  if( I
15070 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
15080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
15090 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44  eAddOp4(v, OP_VD
150a0 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20  estroy, iDb, 0, 
150b0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
150c0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
150d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
150e0 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62  P_DropTable, iDb
150f0 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  , 0, 0, pTab->zN
15100 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ame, 0);.  sqlit
15110 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
15120 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73  Parse, iDb);.  s
15130 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
15140 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f  l(db, iDb);.}../
15150 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15160 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
15170 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
15180 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
15190 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
151a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
151b0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
151c0 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
151d0 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
151e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
151f0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
15200 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e  nt isView, int n
15210 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oErr){.  Table *
15220 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pTab;.  Vdbe *v;
15230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15240 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
15250 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64  nt iDb;..  if( d
15260 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15270 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
15280 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
15290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
152a0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
152b0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
152c0 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
152d0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
152e0 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
152f0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15300 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
15310 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b  db->suppressErr+
15320 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56  +;.  assert( isV
15330 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77  iew==0 || isView
15340 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20 29 3b  ==LOCATE_VIEW );
15350 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
15360 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
15370 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
15380 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a   &pName->a[0]);.
15390 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 64 62    if( noErr ) db
153a0 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d 2d 3b  ->suppressErr--;
153b0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
153c0 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72  ){.    if( noErr
153d0 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65   ) sqlite3CodeVe
153e0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
153f0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
15400 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
15410 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15420 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
15430 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
15440 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
15450 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
15460 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
15470 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
15480 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
15490 61 57 72 69 74 61 62 6c 65 28 70 50 61 72 73 65  aWritable(pParse
154a0 2c 20 69 44 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  , iDb);..  /* If
154b0 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75   pTab is a virtu
154c0 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56  al table, call V
154d0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
154e0 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20  s() to ensure.  
154f0 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c  ** it is initial
15500 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ized..  */.  if(
15510 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
15520 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47   && sqlite3ViewG
15530 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
15540 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
15550 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
15560 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66  p_table;.  }.#if
15570 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15580 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
15590 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
155a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
155b0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
155c0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63  ABLE(iDb);.    c
155d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
155e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
155f0 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  bSName;.    cons
15600 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
15610 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
15620 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15630 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
15640 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
15650 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
15660 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
15680 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
15690 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
156a0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
156b0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
156c0 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
156d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
156e0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
156f0 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
15700 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
15710 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
15720 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
15730 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
15740 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
15750 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15760 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
15770 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
15780 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
15790 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
157a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
157b0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
157c0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
157d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
157e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
157f0 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
15800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15810 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
15820 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
15830 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15840 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
15850 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
15860 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
15870 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
15880 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
15890 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
158a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
158b0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
158c0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
158d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
158e0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
158f0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15900 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
15910 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
15920 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
15930 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
15940 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
15950 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
15960 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
15970 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
15980 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
15990 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
159a0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
159b0 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
159c0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
159d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
159e0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
159f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15a00 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
15a10 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
15a20 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
15a30 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
15a40 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
15a50 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
15a60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
15a70 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
15a80 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
15a90 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15aa0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
15ab0 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
15ac0 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
15ad0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
15ae0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
15af0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
15b00 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
15b10 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
15b20 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15b30 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
15b40 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
15b50 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
15b60 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
15b70 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15b80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15b90 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15ba0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
15bb0 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
15bc0 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
15bd0 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
15be0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15bf0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15c00 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
15c10 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15c20 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
15c30 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  Db);.    if( !is
15c40 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71  View ){.      sq
15c50 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
15c60 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62  bles(pParse, iDb
15c70 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a  , "tbl", pTab->z
15c80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
15c90 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28  ite3FkDropTable(
15ca0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70  pParse, pName, p
15cb0 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Tab);.    }.    
15cc0 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54  sqlite3CodeDropT
15cd0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
15ce0 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b  b, iDb, isView);
15cf0 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
15d00 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33  table:.  sqlite3
15d10 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
15d20 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
15d30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15d40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  is called to cre
15d50 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67  ate a new foreig
15d60 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62  n key on the tab
15d70 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  le.** currently 
15d80 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
15d90 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65  on.  pFromCol de
15da0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63  termines which c
15db0 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
15dc0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70   current table p
15dd0 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65  oint to the fore
15de0 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72  ign key.  If pFr
15df0 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a  omCol==0 then.**
15e00 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79   connect the key
15e10 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   to the last col
15e20 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70  umn inserted.  p
15e30 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  To is the name o
15e40 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72  f.** the table r
15e50 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e  eferred to (a.k.
15e60 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74  a the "parent" t
15e70 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69  able).  pToCol i
15e80 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74  s a list.** of t
15e90 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72  ables in the par
15ea0 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20  ent pTo table.  
15eb0 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61  flags contains a
15ec0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
15ed0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66  n about the conf
15ee0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
15ef0 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69  algorithms speci
15f00 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  fied.** in the O
15f10 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44  N DELETE, ON UPD
15f20 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52  ATE and ON INSER
15f30 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
15f40 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75   An FKey structu
15f50 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  re is created an
15f60 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74  d added to the t
15f70 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a  able currently.*
15f80 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
15f90 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72  tion in the pPar
15fa0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69  se->pNewTable fi
15fb0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  eld..**.** The f
15fc0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65  oreign key is se
15fd0 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20  t for IMMEDIATE 
15fe0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73  processing.  A s
15ff0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
16000 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65  * to sqlite3Defe
16010 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69  rForeignKey() mi
16020 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20  ght change this 
16030 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a  to DEFERRED..*/.
16040 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
16050 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20  teForeignKey(.  
16060 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
16070 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16080 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
16090 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c  rList *pFromCol,
160a0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
160b0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20  this table that 
160c0 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74  point to other t
160d0 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
160e0 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  *pTo,          /
160f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74  * Name of the ot
16100 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  her table */.  E
16110 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c  xprList *pToCol,
16120 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69      /* Columns i
16130 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  n the other tabl
16140 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
16150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16160 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
16170 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a  on algorithms. *
16180 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
16190 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
161a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
161b0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
161c0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d  .  FKey *pFKey =
161d0 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78   0;.  FKey *pNex
161e0 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20  tTo;.  Table *p 
161f0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
16200 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ble;.  int nByte
16210 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
16220 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a   nCol;.  char *z
16230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  ;..  assert( pTo
16240 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
16250 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
16260 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65  VTAB ) goto fk_e
16270 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43  nd;.  if( pFromC
16280 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ol==0 ){.    int
16290 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d   iCol = p->nCol-
162a0 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  1;.    if( NEVER
162b0 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20  (iCol<0) ) goto 
162c0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  fk_end;.    if( 
162d0 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
162e0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
162f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16300 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72  Msg(pParse, "for
16310 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a  eign key on %s".
16320 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c           " shoul
16330 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  d reference only
16340 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74   one column of t
16350 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20  able %T",.      
16360 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d     p->aCol[iCol]
16370 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20  .zName, pTo);.  
16380 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16390 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20  .    }.    nCol 
163a0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
163b0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
163c0 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43  l->nExpr!=pFromC
163d0 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ol->nExpr ){.   
163e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
163f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
16400 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75   "number of colu
16410 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  mns in foreign k
16420 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
16430 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  h the number of 
16440 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d  ".        "colum
16450 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65  ns in the refere
16460 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20  nced table");.  
16470 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
16480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c   }else{.    nCol
16490 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78   = pFromCol->nEx
164a0 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20  pr;.  }.  nByte 
164b0 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29  = sizeof(*pFKey)
164c0 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65   + (nCol-1)*size
164d0 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30  of(pFKey->aCol[0
164e0 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b  ]) + pTo->n + 1;
164f0 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b  .  if( pToCol ){
16500 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
16510 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69  pToCol->nExpr; i
16520 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65  ++){.      nByte
16530 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
16540 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
16550 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  .zName) + 1;.   
16560 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d   }.  }.  pFKey =
16570 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16580 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29  Zero(db, nByte )
16590 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30  ;.  if( pFKey==0
165a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   ){.    goto fk_
165b0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79  end;.  }.  pFKey
165c0 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70  ->pFrom = p;.  p
165d0 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20  FKey->pNextFrom 
165e0 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20  = p->pFKey;.  z 
165f0 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d  = (char*)&pFKey-
16600 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70  >aCol[nCol];.  p
16610 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20  FKey->zTo = z;. 
16620 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
16630 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
16640 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
16650 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
16660 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20  *)z, pTo);.  }. 
16670 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e   memcpy(z, pTo->
16680 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b  z, pTo->n);.  z[
16690 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  pTo->n] = 0;.  s
166a0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
166b0 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b  ;.  z += pTo->n+
166c0 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  1;.  pFKey->nCol
166d0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
166e0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
166f0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
16700 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
16710 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
16720 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
16730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
16740 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
16750 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
16760 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16770 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
16780 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
16790 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
167a0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
167b0 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
167c0 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
167d0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
167e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
167f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
16800 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
16810 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16820 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
16830 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
16840 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
16850 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
16860 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
16870 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
16880 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
16890 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
168a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
168b0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
168c0 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
168d0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
168e0 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
168f0 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c  &pFKey->aCol[i],
16900 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
16910 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
16920 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16930 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
16940 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
16950 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
16960 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
16970 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
16980 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
16990 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
169a0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28  l = z;.      if(
169b0 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
169c0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  T ){.        sql
169d0 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
169e0 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20  emap(pParse, z, 
169f0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
16a00 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
16a10 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
16a20 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
16a30 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
16a40 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
16a50 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
16a60 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
16a70 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
16a80 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75  >aAction[0] = (u
16a90 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29  8)(flags & 0xff)
16aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16ab0 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e  ON DELETE action
16ac0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   */.  pFKey->aAc
16ad0 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28  tion[1] = (u8)((
16ae0 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
16af0 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55  xff);    /* ON U
16b00 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  PDATE action */.
16b10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16b20 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
16b30 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68  d(db, 0, p->pSch
16b40 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54  ema) );.  pNextT
16b50 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69  o = (FKey *)sqli
16b60 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
16b70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48  ->pSchema->fkeyH
16b80 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65  ash, .      pFKe
16b90 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29  y->zTo, (void *)
16ba0 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28  pFKey.  );.  if(
16bb0 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20   pNextTo==pFKey 
16bc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  ){.    sqlite3Oo
16bd0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
16be0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
16bf0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29  .  if( pNextTo )
16c00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
16c10 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d  extTo->pPrevTo==
16c20 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 );.    pFKey->
16c30 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54  pNextTo = pNextT
16c40 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e  o;.    pNextTo->
16c50 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b  pPrevTo = pFKey;
16c60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
16c70 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
16c80 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20  to the table as 
16c90 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20  the last step.. 
16ca0 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d   */.  p->pFKey =
16cb0 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20   pFKey;.  pFKey 
16cc0 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20  = 0;..fk_end:.  
16cd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16ce0 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66  , pFKey);.#endif
16cf0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
16d00 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
16d10 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74  _KEY) */.  sqlit
16d20 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
16d30 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a  (db, pFromCol);.
16d40 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
16d50 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43  tDelete(db, pToC
16d60 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ol);.}../*.** Th
16d70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
16d80 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49  lled when an INI
16d90 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
16da0 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45   or INITIALLY DE
16db0 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65  FERRED.** clause
16dc0 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74   is seen as part
16dd0 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65   of a foreign ke
16de0 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54  y definition.  T
16df0 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a  he isDeferred.**
16e00 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20   parameter is 1 
16e10 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  for INITIALLY DE
16e20 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72  FERRED and 0 for
16e30 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
16e40 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68  IATE..** The beh
16e50 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73  avior of the mos
16e60 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
16e70 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ed foreign key i
16e80 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63  s adjusted.** ac
16e90 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f  cordingly..*/.vo
16ea0 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  id sqlite3DeferF
16eb0 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20  oreignKey(Parse 
16ec0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44  *pParse, int isD
16ed0 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65  eferred){.#ifnde
16ee0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
16ef0 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c  REIGN_KEY.  Tabl
16f00 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20  e *pTab;.  FKey 
16f10 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70  *pFKey;.  if( (p
16f20 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
16f30 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28  ewTable)==0 || (
16f40 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46  pFKey = pTab->pF
16f50 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Key)==0 ) return
16f60 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65  ;.  assert( isDe
16f70 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44  ferred==0 || isD
16f80 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a  eferred==1 ); /*
16f90 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39   EV: R-30323-219
16fa0 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69  17 */.  pFKey->i
16fb0 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29  sDeferred = (u8)
16fc0 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64  isDeferred;.#end
16fd0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  if.}../*.** Gene
16fe0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
16ff0 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65  ill erase and re
17000 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78  fill index *pIdx
17010 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73  .  This is.** us
17020 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
17030 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64   a newly created
17040 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63   index or to rec
17050 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f  ompute the.** co
17060 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65  ntent of an inde
17070 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f  x in response to
17080 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61   a REINDEX comma
17090 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d  nd..**.** if mem
170a0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20  RootPage is not 
170b0 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61  negative, it mea
170c0 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65  ns that the inde
170d0 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72  x is newly.** cr
170e0 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69  eated.  The regi
170f0 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62  ster specified b
17100 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f  y memRootPage co
17110 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f  ntains the.** ro
17120 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
17130 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66  f the index.  If
17140 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
17150 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a  negative, then.*
17160 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  * the index alre
17170 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d  ady exists and m
17180 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62  ust be cleared b
17190 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69  efore being refi
171a0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  lled and.** the 
171b0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
171c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
171d0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64   taken from pInd
171e0 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61  ex->tnum..*/.sta
171f0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
17200 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73  RefillIndex(Pars
17210 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
17220 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65   *pIndex, int me
17230 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61  mRootPage){.  Ta
17240 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
17250 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20  ex->pTable;  /* 
17260 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  The table that i
17270 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  s indexed */.  i
17280 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
17290 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
172a0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
172b0 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20  ed for pTab */. 
172c0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72   int iIdx = pPar
172d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
172e0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
172f0 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20  used for pIndex 
17300 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72  */.  int iSorter
17310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17320 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
17330 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74  ened by OpenSort
17340 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a  er (if in use) *
17350 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20  /.  int addr1;  
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17370 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
17380 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   top of loop */.
17390 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20    int addr2;    
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a   /* Address to j
173c0 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20  ump to for next 
173d0 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iteration */.  i
173e0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17400 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
17410 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  dex */.  int iPa
17420 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20  rtIdxLabel;     
17430 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
17440 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f  to this label to
17450 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20   skip a row */. 
17460 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17490 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
174a0 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
174b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
174d0 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
174e0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
174f0 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20  Record;         
17500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
17510 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65  ter holding asse
17520 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f  mbled index reco
17530 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rd */.  sqlite3 
17540 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
17550 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  ;      /* The da
17560 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17570 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  n */.  int iDb =
17580 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
17590 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
175a0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
175b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
175c0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
175d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
175e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
175f0 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49  LITE_REINDEX, pI
17600 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a  ndex->zName, 0,.
17610 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
17620 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b  b].zDbSName ) ){
17630 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
17640 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
17650 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
17660 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
17670 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
17680 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
17690 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
176a0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
176b0 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
176c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
176d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
176e0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
176f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17700 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
17710 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
17720 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
17730 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
17740 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
17750 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
17760 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
17770 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
17780 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  x);.  assert( pK
17790 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ey!=0 || db->mal
177a0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
177b0 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20  rse->nErr );..  
177c0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74  /* Open the sort
177d0 65 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20  er cursor if we 
177e0 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20  are to use one. 
177f0 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70  */.  iSorter = p
17800 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
17810 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17820 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
17830 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c  pen, iSorter, 0,
17840 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
17850 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20  , (char*).      
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
17870 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
17880 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46  pKey), P4_KEYINF
17890 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  O);..  /* Open t
178a0 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74  he table. Loop t
178b0 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20  hrough all rows 
178c0 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  of the table, in
178d0 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20  serting index.  
178e0 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ** records into 
178f0 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20  the sorter. */. 
17900 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
17910 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
17920 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
17930 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
17940 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17950 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
17960 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62  d, iTab, 0); Vdb
17970 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17980 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
17990 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
179a0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
179b0 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73  MultiWrite(pPars
179c0 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
179d0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
179e0 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61  Parse,pIndex,iTa
179f0 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69  b,regRecord,0,&i
17a00 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30  PartIdxLabel,0,0
17a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17a20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
17a30 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74  terInsert, iSort
17a40 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  er, regRecord);.
17a50 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
17a60 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61  PartIdxLabel(pPa
17a70 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62  rse, iPartIdxLab
17a80 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
17a90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
17aa0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
17ab0 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
17ac0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
17ad0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17ae0 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ddr1);.  if( mem
17af0 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c  RootPage<0 ) sql
17b00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17b10 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d  , OP_Clear, tnum
17b20 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
17b30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17b40 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64  P_OpenWrite, iId
17b50 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20  x, tnum, iDb, . 
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b70 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c     (char *)pKey,
17b80 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
17b90 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17ba0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55  eP5(v, OPFLAG_BU
17bb0 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50  LKCSR|((memRootP
17bc0 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50  age>=0)?OPFLAG_P
17bd0 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61  2ISREG:0));..  a
17be0 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
17bf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
17c00 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74  orterSort, iSort
17c10 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  er, 0); VdbeCove
17c20 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49  rage(v);.  if( I
17c30 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e  sUniqueIndex(pIn
17c40 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  dex) ){.    int 
17c50 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
17c60 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20  Goto(v, 1);.    
17c70 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
17c80 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17c90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17ca0 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c  beVerifyAbortabl
17cb0 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a  e(v, OE_Abort);.
17cc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17cd0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
17ce0 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
17cf0 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
17d00 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17d20 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b  Index->nKeyCol);
17d30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69  ;.    sqlite3Uni
17d50 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  queConstraint(pP
17d60 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  arse, OE_Abort, 
17d70 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  pIndex);.    sql
17d80 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
17d90 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65  (v, j2);.  }else
17da0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  {.    addr2 = sq
17db0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17dc0 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73  Addr(v);.  }.  s
17dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17de0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
17df0 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  a, iSorter, regR
17e00 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20  ecord, iIdx);.  
17e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e20 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c  1(v, OP_SeekEnd,
17e30 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
17e40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17e50 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
17e60 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
17e70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
17e80 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
17e90 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
17ea0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17eb0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17ec0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
17ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17ee0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
17ef0 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
17f00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
17f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17f20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
17f30 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
17f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
17f50 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
17f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17f70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
17f80 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
17f90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
17fa0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
17fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17fc0 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
17fd0 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
17fe0 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
17ff0 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
18000 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
18010 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
18020 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
18030 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
18040 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
18050 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
18060 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
18070 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
18080 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
18090 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
180a0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
180b0 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
180c0 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
180d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
180e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
180f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
18100 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
18110 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
18120 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18130 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
18140 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
18150 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18160 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
18170 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
18180 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
18190 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
181a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
181b0 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
181c0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
181d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
181e0 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
181f0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
18200 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18210 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
18220 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
18230 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
18240 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
18250 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
18260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18270 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
18280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
18290 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
182a0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
182b0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
182c0 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
182d0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
182e0 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
182f0 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
18300 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
18310 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
18320 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
18330 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
18340 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
18350 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
18360 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
18370 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
18380 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
18390 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
183a0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
183b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
183c0 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
183d0 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
183e0 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
183f0 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
18400 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
18410 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
18420 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
18430 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
18440 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
18450 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
18460 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
18470 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
18480 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
18490 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
184a0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
184b0 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
184c0 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
184d0 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
184e0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
184f0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
18500 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
18510 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
18520 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
18530 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
18540 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
18550 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
18560 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
18570 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
18580 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
18590 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
185a0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
185b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
185c0 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
185d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
185e0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
185f0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
18600 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
18610 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
18620 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
18630 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
18640 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
18650 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
18660 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
18670 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
18680 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
18690 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
186a0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
186b0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
186c0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
186d0 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
186e0 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
186f0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
18700 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
18710 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
18720 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
18730 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
18740 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
18750 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
18760 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
18770 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
18780 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
18790 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
187a0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
187b0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
187c0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
187d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
187e0 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n.  .*/.void sql
187f0 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
18800 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
18810 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66  ,     /* All inf
18820 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
18830 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54  his parse */.  T
18840 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
18850 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
18860 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
18870 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
18880 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
18890 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
188a0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
188b0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
188c0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e    SrcList *pTblN
188d0 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f  ame, /* Table to
188e0 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72   index. Use pPar
188f0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66  se->pNewTable if
18900 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74   0 */.  ExprList
18910 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20   *pList,   /* A 
18920 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
18930 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
18940 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
18950 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72        /* OE_Abor
18960 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45  t, OE_Ignore, OE
18970 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f  _Replace, or OE_
18980 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  None */.  Token 
18990 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20  *pStart,     /* 
189a0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
189b0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69   that begins thi
189c0 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
189d0 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c   Expr *pPIWhere,
189e0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61      /* WHERE cla
189f0 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20  use for partial 
18a00 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
18a10 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
18a20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
18a30 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
18a40 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
18a50 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
18a60 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t,    /* Omit er
18a70 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
18a80 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20  eady exists */. 
18a90 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20   u8 idxType     
18aa0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78      /* The index
18ab0 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61   type */.){.  Ta
18ac0 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
18ad0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
18ae0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
18af0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
18b00 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
18b10 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
18b20 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
18b30 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
18b40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
18b50 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
18b60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18b70 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
18b80 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
18b90 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 73 6f  t i, j;.  int so
18ba0 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
18bb0 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
18bc0 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
18bd0 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
18be0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18bf0 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
18c00 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18c10 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
18c20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
18c30 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
18c40 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
18c50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18c60 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
18c70 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
18c80 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
18c90 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
18ca0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
18cb0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
18cc0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
18cd0 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
18ce0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
18cf0 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
18d00 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
18d10 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
18d20 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
18d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
18d40 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
18d50 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
18d60 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
18d90 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
18da0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
18db0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
18dc0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
18dd0 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
18de0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
18df0 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
18e00 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
18e10 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
18e20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
18e30 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
18e40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18e50 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
18e60 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
18e70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18e80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
18e90 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
18ea0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
18eb0 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
18ec0 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
18ed0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18ee0 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
18ef0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
18f00 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
18f10 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18f20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18f30 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
18f40 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
18f50 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
18f60 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
18f70 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
18f80 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
18f90 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
18fa0 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
18fb0 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
18fc0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
18fd0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
18fe0 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
18ff0 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
19000 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
19010 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
19020 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
19030 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
19040 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
19050 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
19060 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
19070 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
19080 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
19090 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
190a0 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
190b0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
190c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
190d0 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
190e0 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
190f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19100 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
19110 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
19120 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
19130 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
19140 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
19150 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
19160 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
19170 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
19180 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
19190 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
191a0 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
191b0 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
191c0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
191d0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
191e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
191f0 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
19200 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
19210 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
19220 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
19230 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
19240 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
19250 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
19260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19270 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 69  endif..    if( i
19280 44 62 21 3d 31 20 29 20 70 54 62 6c 4e 61 6d 65  Db!=1 ) pTblName
19290 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
192a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
192b0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 70 54  zDbSName;.    pT
192c0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
192d0 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
192e0 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65  se, 0, &pTblName
192f0 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 70 54 62  ->a[0]);.    pTb
19300 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  lName->a[0].zDat
19310 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 61  abase = 0;.    a
19320 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19330 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
19340 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
19350 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
19360 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19370 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
19380 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
19390 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
193a0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
193b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
193c0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
193d0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
193e0 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
193f0 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
19400 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
19410 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
19420 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
19430 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19440 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
19450 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
19460 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
19470 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
19480 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
19490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
194a0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
194b0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
194c0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
194d0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
194e0 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
194f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19500 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
19510 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
19520 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
19530 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
19540 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
19550 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
19560 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
19570 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
19580 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
19590 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
195a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
195b0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
195c0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
195d0 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
195e0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
195f0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
19600 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
19610 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
19620 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69  me)==0.#endif.#i
19630 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
19640 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f  W_SQLITE_MASTER_
19650 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26 26 20  INDEX.       && 
19660 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26  sqlite3StrICmp(&
19670 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
19680 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64  master")!=0.#end
19690 69 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  if.       && sql
196a0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54  ite3StrNICmp(&pT
196b0 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c  ab->zName[7],"al
196c0 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 0a 20  tertab_",9)!=0. 
196d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
196e0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
196f0 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
19700 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
19710 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19720 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19730 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
19740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19750 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
19760 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
19770 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19780 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
19790 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
197a0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
197b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
197c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
197d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
197e0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
197f0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19800 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
19810 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19820 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
19830 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
19840 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
19850 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19860 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
19870 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
19880 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
19890 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
198a0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
198b0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
198c0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
198d0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
198e0 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
198f0 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
19900 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
19910 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
19920 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
19930 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
19940 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
19950 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
19960 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
19970 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
19980 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
19990 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
199a0 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
199b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
199c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
199d0 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
199e0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
199f0 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
19a00 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
19a10 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
19a20 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
19a30 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
19a40 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
19a50 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
19a60 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
19a70 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
19a80 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
19a90 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
19aa0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
19ab0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
19ac0 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
19ad0 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
19ae0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
19af0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19b00 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
19b10 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
19b20 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
19b30 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
19b40 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
19b50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19b60 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19b70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
19b80 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
19b90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64   ){.      if( !d
19ba0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
19bb0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
19bc0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
19bd0 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
19be0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
19bf0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
19c00 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
19c10 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
19c20 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
19c30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
19c40 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19c60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
19c70 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
19c80 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
19c90 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  DbSName)!=0 ){. 
19ca0 20 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f         if( !ifNo
19cb0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
19cc0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19cd0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
19ce0 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
19cf0 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
19d00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19d10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19d20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
19d30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19d40 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
19d50 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
19d60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19d70 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
19d80 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
19da0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
19db0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
19dc0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
19dd0 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
19de0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
19df0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
19e00 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
19e10 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
19e20 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
19e30 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
19e40 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
19e50 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
19e60 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
19e70 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
19e80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74     }..    /* Aut
19e90 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
19ea0 65 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  es generated fro
19eb0 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  m within sqlite3
19ec0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a  _declare_vtab().
19ed0 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65      ** must have
19ee0 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
19ef0 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f  distinct from no
19f00 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69  rmal automatic i
19f10 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20  ndex names..    
19f20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19f30 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65   statement conve
19f40 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74  rts "sqlite3_aut
19f50 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a  oindex..." into.
19f60 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f      ** "sqlite3_
19f70 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  butoindex..." in
19f80 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74   order to make t
19f90 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63  he names distinc
19fa0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76  t..    ** The "v
19fb0 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65  tab_err.test" te
19fc0 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20  st demonstrates 
19fd0 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73  the need of this
19fe0 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
19ff0 20 20 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41     if( IN_SPECIA
1a000 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b  L_PARSE ) zName[
1a010 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  7]++;.  }..  /* 
1a020 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
1a030 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
1a040 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
1a050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a060 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1a070 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  ON.  if( !IN_REN
1a080 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a090 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1a0a0 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  b = pDb->zDbSNam
1a0b0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
1a0c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a0d0 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
1a0e0 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
1a0f0 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
1a100 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a110 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a120 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
1a130 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
1a140 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
1a150 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1a160 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
1a170 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
1a180 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a190 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a1a0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
1a1b0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1a1c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a1d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a1e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a1f0 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
1a200 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
1a210 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1a220 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
1a230 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
1a240 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
1a250 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
1a260 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
1a270 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
1a280 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
1a290 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
1a2a0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
1a2b0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1a2c0 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43  .    Token prevC
1a2d0 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ol;.    Column *
1a2e0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1a2f0 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
1a300 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
1a310 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
1a320 55 4e 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69  UNIQUE;.    sqli
1a330 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72  te3TokenInit(&pr
1a340 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  evCol, pCol->zNa
1a350 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
1a360 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a370 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1a380 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a390 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
1a3a0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65  (db, TK_ID, &pre
1a3b0 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69  vCol, 0));.    i
1a3c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
1a3d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a3e0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a3f0 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
1a400 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
1a410 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
1a420 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74  rder(pList, sort
1a430 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Order);.  }else{
1a440 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a450 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
1a460 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22  pParse, pList, "
1a470 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20  index");.  }..  
1a480 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a490 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
1a4a0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
1a4b0 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
1a4c0 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
1a4d0 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
1a4e0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
1a4f0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1a500 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1a510 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1a520 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
1a530 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
1a540 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
1a550 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
1a560 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1a570 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
1a580 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
1a590 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1a5a0 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
1a5b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
1a5c0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
1a5d0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
1a5e0 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
1a5f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a600 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
1a610 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
1a620 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
1a630 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1a640 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
1a650 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
1a660 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
1a670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
1a6a0 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
1a6b0 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
1a6c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1a6d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a6e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1a6f0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1a700 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1a710 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
1a720 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
1a730 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1a740 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
1a750 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
1a760 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
1a770 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
1a780 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
1a790 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
1a7a0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
1a7b0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
1a7c0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
1a7d0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
1a7e0 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
1a7f0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1a800 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
1a810 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
1a820 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79  >idxType = idxTy
1a830 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  pe;.  pIndex->pS
1a840 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
1a850 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
1a860 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1a870 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1a880 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
1a890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1a8a0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1a8b0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1a8c0 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
1a8d0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
1a8e0 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
1a8f0 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
1a900 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
1a910 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a920 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1a930 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1a940 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
1a950 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
1a960 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
1a970 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
1a980 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
1a990 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
1a9a0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
1a9b0 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
1a9c0 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
1a9d0 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
1a9e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
1a9f0 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
1aa00 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
1aa10 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
1aa20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
1aa30 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
1aa40 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
1aa50 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
1aa60 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
1aa70 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
1aa80 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1aa90 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
1aaa0 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
1aab0 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
1aac0 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
1aad0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
1aae0 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
1aaf0 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
1ab00 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
1ab10 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1ab20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
1ab30 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
1ab40 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
1ab50 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
1ab60 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
1ab70 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
1ab80 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
1ab90 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
1aba0 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
1abb0 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
1abc0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
1abd0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
1abe0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
1abf0 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74  ey..  */.  pList
1ac00 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1ac10 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
1ac20 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70  _OBJECT ){.    p
1ac30 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1ac40 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69  = pList;.    pLi
1ac50 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  st = 0;.  }.  fo
1ac60 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
1ac70 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70  >nKeyCol; i++, p
1ac80 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
1ac90 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20   Expr *pCExpr;  
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65  /* The i-th inde
1acc0 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
1acd0 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
1ace0 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  dSortOrder;     
1acf0 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
1ad00 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78  C on the i-th ex
1ad10 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1ad20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1ad30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1ad40 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
1ad50 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
1ad60 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
1ad70 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  oId(pListItem->p
1ad80 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
1ad90 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1ada0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1adb0 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Tab, NC_IdxExpr,
1adc0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1add0 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
1ade0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
1adf0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1ae00 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72  ndex;.    pCExpr
1ae10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1ae20 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49  ipCollate(pListI
1ae30 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1ae40 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21   if( pCExpr->op!
1ae50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1ae60 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50      if( pTab==pP
1ae70 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1ae80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ae90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1aea0 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20  e, "expressions 
1aeb0 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
1aec0 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a  IMARY KEY and ".
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  "UNIQUE constrai
1af00 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67  nts");.        g
1af10 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1af20 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1af30 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
1af40 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a  >aColExpr==0 ){.
1af50 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1af60 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74  aColExpr = pList
1af70 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
1af80 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1af90 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
1afa0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1afb0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
1afc0 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1afd0 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1afe0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1aff0 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
1b000 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1b010 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
1b020 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
1b030 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
1b040 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
1b050 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1b060 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
1b070 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1b080 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1b090 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1b0a0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1b0b0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b0c0 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
1b0d0 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1b0e0 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
1b0f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1b100 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
1b110 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
1b120 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
1b130 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
1b140 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
1b150 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b160 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
1b170 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
1b180 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
1b190 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
1b1a0 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
1b1b0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
1b1c0 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
1b1d0 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
1b1e0 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
1b1f0 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
1b200 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
1b210 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
1b220 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1b230 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
1b240 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
1b250 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1b260 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1b270 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
1b280 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1b290 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
1b2a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1b2b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b2c0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
1b2d0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
1b2e0 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
1b2f0 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
1b300 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
1b310 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
1b320 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
1b330 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
1b340 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
1b350 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
1b360 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
1b370 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
1b380 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1b390 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
1b3a0 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
1b3b0 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
1b3c0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
1b3d0 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
1b3e0 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
1b3f0 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
1b400 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
1b410 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
1b420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
1b430 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
1b440 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1b450 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1b460 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
1b470 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
1b480 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
1b490 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
1b4a0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b4b0 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
1b4c0 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
1b4d0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1b4e0 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1b4f0 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1b500 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b510 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
1b520 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
1b530 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
1b540 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1b550 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1b560 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1b570 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1b580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b590 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1b5a0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1b5b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1b5c0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1b5d0 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1b5e0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b5f0 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1b600 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1b610 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1b620 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1b630 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1b640 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1b650 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1b660 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1b670 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1b680 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1b690 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1b6a0 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1b6b0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1b6c0 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1b6d0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1b6e0 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1b6f0 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1b700 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1b710 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1b720 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d  y)>=0 );.  recom
1b730 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
1b740 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b 0a 20  dexed(pIndex);. 
1b750 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1b760 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   && pIndex->nCol
1b770 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn>=pTab->nCol 
1b780 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69  ){.    pIndex->i
1b790 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
1b7a0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1b7b0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1b7c0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1b7d0 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
1b7e0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
1b7f0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1b800 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30  dex(pIndex,j)>=0
1b810 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b820 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1b830 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  ering = 0;.     
1b840 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1b850 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  }..  if( pTab==p
1b860 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1b870 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1b880 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
1b890 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
1b8a0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
1b8b0 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
1b8c0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
1b8d0 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1b8e0 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
1b8f0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1b900 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
1b910 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1b920 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
1b930 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
1b940 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
1b950 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
1b960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1b970 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
1b980 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1b990 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1b9a0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
1b9b0 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
1b9c0 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
1b9d0 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
1b9e0 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
1b9f0 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
1ba00 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
1ba10 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
1ba20 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
1ba30 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
1ba40 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
1ba50 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1ba60 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
1ba70 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
1ba80 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
1ba90 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
1baa0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
1bab0 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
1bac0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1bad0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
1bae0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1baf0 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
1bb00 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
1bb10 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
1bb20 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
1bb30 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
1bb40 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
1bb50 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
1bb60 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
1bb70 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
1bb80 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
1bb90 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
1bba0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
1bbb0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
1bbc0 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
1bbd0 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
1bbe0 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
1bbf0 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1bc00 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
1bc10 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
1bc20 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
1bc30 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
1bc40 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1bc50 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1bc60 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1bc70 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
1bc80 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
1bc90 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1bca0 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20  dex(pIdx) );.   
1bcb0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1bcc0 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1bcd0 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1bce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1bcf0 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1bd00 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20  Index) );..     
1bd10 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
1bd20 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ol!=pIndex->nKey
1bd30 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
1bd40 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1bd50 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
1bd60 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
1bd70 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
1bd80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1bd90 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73   *z2;.        as
1bda0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1bdb0 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[k]>=0 );.  
1bdc0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1bdd0 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
1bde0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
1bdf0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1be00 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43    z1 = pIdx->azC
1be10 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1be20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
1be30 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1be40 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1be50 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1be60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1be70 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1be80 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1be90 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1bea0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1beb0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1bec0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1bed0 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1bee0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1bef0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1bf00 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1bf10 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1bf20 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1bf30 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1bf40 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1bf50 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1bf60 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1bf70 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1bf80 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1bf90 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1bfa0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1bfb0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1bfc0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1bfd0 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1bfe0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1bff0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1c000 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1c010 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1c020 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1c030 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1c040 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1c050 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1c060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c070 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1c080 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1c090 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1c0a0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1c0b0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1c0c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c0d0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1c0e0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1c0f0 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1c100 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1c110 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1c120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c130 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1c140 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1c150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1c160 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1c170 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1c180 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c1a0 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  ( idxType==SQLIT
1c1b0 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
1c1c0 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78  YKEY ) pIdx->idx
1c1d0 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1c1e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1c1f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1c200 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c210 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  }..  if( !IN_REN
1c220 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20  AME_OBJECT ){.. 
1c230 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
1c240 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1c250 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1c260 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1c270 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  .    ** in-memor
1c280 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1c290 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20  tures. .    */. 
1c2a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1c2b0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1c2c0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1c2d0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
1c2e0 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73  ex *p;.      ass
1c2f0 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c  ert( !IN_SPECIAL
1c300 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20  _PARSE );.      
1c310 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1c320 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1c330 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1c340 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
1c350 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1c360 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1c370 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1c380 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64   .          pInd
1c390 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1c3a0 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20  x);.      if( p 
1c3b0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c3c0 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1c3d0 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1c3e0 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1c3f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
1c400 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1c410 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c420 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c430 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44    }.      db->mD
1c440 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1c450 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1c460 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d       if( pTblNam
1c470 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
1c480 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1c490 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1c4a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c4b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c4c0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1c4d0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1c4e0 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1c4f0 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 20  TABLE if the.   
1c500 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1c510 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1c520 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1c530 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1c540 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20 2a  aint) then.    *
1c550 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1c560 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1c570 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1c580 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1c590 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ntry for.    ** 
1c5a0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1c5b0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1c5c0 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1c5d0 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1c5e0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  .    ** content.
1c5f0 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f    But, do not do
1c600 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20   this if we are 
1c610 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74  simply reading t
1c620 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1c630 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  .    ** table to
1c640 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1c650 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1c660 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1c670 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 20  RY KEY index.   
1c680 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1c690 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1c6a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1c6b0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1c6c0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1c6d0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1c6e0 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1c6f0 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20  Y KEY.    ** or 
1c700 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1c710 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1c720 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1c730 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
1c740 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1c750 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1c760 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1c770 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1c780 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  alization.    **
1c790 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1c7a0 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
1c7b0 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77   else if( HasRow
1c7c0 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c  id(pTab) || pTbl
1c7d0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1c7e0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20 20   Vdbe *v;.      
1c7f0 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1c800 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1c810 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1c820 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33       v = sqlite3
1c830 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1c840 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20  .      if( v==0 
1c850 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1c860 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20  te_index;..     
1c870 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1c880 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1c890 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1c8a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1c8b0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1c8c0 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1c8d0 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1c8e0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
1c8f0 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61  doing so, code a
1c900 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f   Noop instructio
1c910 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20  n and store its 
1c920 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20  address in .    
1c930 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1c940 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1c950 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1c960 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1c970 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52 49   a .      ** PRI
1c980 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1c990 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1c9a0 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1c9b0 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1c9c0 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1c9d0 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1c9e0 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1c9f0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1ca00 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20  eplace.      ** 
1ca10 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1ca20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1ca30 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1ca40 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1ca50 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65 78   */.      pIndex
1ca60 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  ->tnum = sqlite3
1ca70 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1ca80 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  _Noop);.      sq
1ca90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1caa0 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
1cab0 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54  e, iDb, iMem, BT
1cac0 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20  REE_BLOBKEY);.. 
1cad0 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74       /* Gather t
1cae0 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1caf0 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1cb00 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1cb10 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nto.      ** the
1cb20 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
1cb30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1cb40 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1cb50 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1cb60 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
1cb70 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
1cb80 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
1cb90 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
1cba0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
1cbb0 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
1cbc0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e  ;.        /* A n
1cbd0 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1cbe0 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1cbf0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1cc00 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  nt */.        zS
1cc10 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1cc20 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1cc30 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72              onEr
1cc50 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
1cc60 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e  " : " UNIQUE", n
1cc70 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
1cc80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc90 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1cca0 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1ccb0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1ccc0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1ccd0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  raint */.       
1cce0 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
1ccf0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
1cd00 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  */.        zStmt
1cd10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
1cd20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65       /* Add an e
1cd30 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1cd40 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1cd50 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ndex.      */.  
1cd60 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1cd70 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
1cd80 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1cd90 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1cda0 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1cdb0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1cdc0 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1cdd0 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1cde0 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
1cdf0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1ce00 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54  me,.          pT
1ce10 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1ce20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
1ce30 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20       zStmt.     
1ce40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
1ce50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ce60 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f  zStmt);..      /
1ce70 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1ce80 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1ce90 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1cea0 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1ceb0 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  pire.      ** to
1cec0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1ced0 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1cee0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a  tements..      *
1cef0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c  /.      if( pTbl
1cf00 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1cf10 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1cf20 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1cf30 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1cf40 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1cf50 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1cf60 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
1cf70 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
1cf80 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20  chemaOp(pParse, 
1cf90 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  iDb,.           
1cfa0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1cfb0 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41  db, "name='%q' A
1cfc0 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  ND type='index'"
1cfd0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1cfe0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1cff0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1d000 4f 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29  OP_Expire, 0, 1)
1d010 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1d020 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1d030 48 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e  Here(v, pIndex->
1d040 74 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tnum);.    }.  }
1d050 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1d060 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1d070 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1d080 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1d090 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1d0a0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1d0b0 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1d0c0 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1d0d0 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1d0e0 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1d0f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1d100 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1d110 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1d120 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1d130 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1d140 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1d150 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1d160 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1d170 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1d180 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ts..  */.  if( d
1d190 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
1d1a0 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  pTblName==0 ){. 
1d1b0 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d     if( onError!=
1d1c0 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54  OE_Replace || pT
1d1d0 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20  ab->pIndex==0.  
1d1e0 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e         || pTab->
1d1f0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d  pIndex->onError=
1d200 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20  =OE_Replace){.  
1d210 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78      pIndex->pNex
1d220 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  t = pTab->pIndex
1d230 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49  ;.      pTab->pI
1d240 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
1d250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d260 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20  Index *pOther = 
1d270 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1d280 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65      while( pOthe
1d290 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68  r->pNext && pOth
1d2a0 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72  er->pNext->onErr
1d2b0 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29  or!=OE_Replace )
1d2c0 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72  {.        pOther
1d2d0 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74   = pOther->pNext
1d2e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d2f0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1d300 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1d310 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65       pOther->pNe
1d320 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  xt = pIndex;.   
1d330 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20   }.    pIndex = 
1d340 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  0;.  }.  else if
1d350 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1d360 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CT ){.    assert
1d370 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e  ( pParse->pNewIn
1d380 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  dex==0 );.    pP
1d390 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20  arse->pNewIndex 
1d3a0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49  = pIndex;.    pI
1d3b0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
1d3c0 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
1d3d0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
1d3e0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1d3f0 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
1d400 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
1d410 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1d420 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1d430 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1d440 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1d450 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1d460 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1d470 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1d480 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1d490 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d4a0 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zName);.}../*.**
1d4b0 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1d4c0 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1d4d0 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1d4e0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1d4f0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1d500 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1d510 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1d520 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1d530 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1d540 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1d550 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1d560 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1d570 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1d580 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1d590 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1d5a0 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1d5b0 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1d5c0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1d5d0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1d5e0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1d5f0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1d600 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1d610 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1d620 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1d630 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1d640 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1d650 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1d660 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1d670 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1d680 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1d690 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1d6a0 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1d6b0 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1d6c0 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1d6d0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1d6e0 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1d6f0 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1d700 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1d710 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1d720 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1d730 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1d740 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1d750 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1d760 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1d770 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1d780 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1d790 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1d7a0 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1d7b0 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1d7c0 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1d7d0 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1d7e0 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1d7f0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1d800 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1d810 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1d820 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1d830 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1d840 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1d850 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1d860 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1d870 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1d880 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1d890 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1d8a0 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1d8b0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1d8c0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e   int i;..  /* In
1d8d0 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61 75  dexes with defau
1d8e0 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73  lt row estimates
1d8f0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65   should not have
1d900 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20   stat1 data */. 
1d910 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e   assert( !pIdx->
1d920 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f  hasStat1 );..  /
1d930 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20  * Set the first 
1d940 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66  entry (number of
1d950 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
1d960 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d  ex) to the estim
1d970 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  ated .  ** numbe
1d980 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1d990 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20   table, or half 
1d9a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1d9b0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  ws in the table.
1d9c0 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69    ** for a parti
1d9d0 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20  al index.   But 
1d9e0 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65  do not let the e
1d9f0 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c  stimate drop bel
1da00 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d  ow 10. */.  a[0]
1da10 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1da20 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69  >nRowLogEst;.  i
1da30 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  f( pIdx->pPartId
1da40 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d  xWhere!=0 ) a[0]
1da50 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28   -= 10;  assert(
1da60 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   10==sqlite3LogE
1da70 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61  st(2) );.  if( a
1da80 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20  [0]<33 ) a[0] = 
1da90 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  33;             
1daa0 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d       assert( 33=
1dab0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1dac0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69  0) );..  /* Esti
1dad0 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69  mate that a[1] i
1dae0 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c  s 10, a[2] is 9,
1daf0 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d   a[3] is 8, a[4]
1db00 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20   is 7, a[5] is. 
1db10 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73   ** 6 and each s
1db20 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20  ubsequent value 
1db30 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20  (if any) is 5.  
1db40 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31  */.  memcpy(&a[1
1db50 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73  ], aVal, nCopy*s
1db60 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a  izeof(LogEst));.
1db70 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b    for(i=nCopy+1;
1db80 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i<=pIdx->nKeyCo
1db90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  l; i++){.    a[i
1dba0 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20  ] = 23;         
1dbb0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1dbc0 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 23==sqlite3Lo
1dbd0 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a  gEst(5) );.  }..
1dbe0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
1dbf0 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
1dc00 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49  .  if( IsUniqueI
1dc10 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70  ndex(pIdx) ) a[p
1dc20 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20  Idx->nKeyCol] = 
1dc30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1dc40 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
1dc50 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
1dc60 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
1dc70 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
1dc80 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
1dc90 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1dca0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1dcb0 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
1dcc0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1dcd0 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
1dce0 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
1dcf0 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
1dd00 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
1dd10 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1dd20 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
1dd30 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1dd40 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
1dd50 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1dd60 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
1dd70 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1dd80 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1dd90 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1dda0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1ddb0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
1ddc0 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
1ddd0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1dde0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1ddf0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1de00 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1de10 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1de20 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1de30 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
1de40 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
1de50 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
1de60 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
1de70 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
1de80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1de90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1dea0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1deb0 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
1dec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ded0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1dee0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1def0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
1df00 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1df10 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1df20 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1df30 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
1df40 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1df50 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
1df60 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1df70 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b  DXTYPE_APPDEF ){
1df80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1df90 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
1dfa0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1dfb0 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
1dfc0 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
1dfd0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
1dfe0 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
1dff0 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
1e000 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1e010 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1e020 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1e030 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
1e040 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
1e050 53 63 68 65 6d 61 57 72 69 74 61 62 6c 65 28 70  SchemaWritable(p
1e060 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 23 69 66  Parse, iDb);.#if
1e070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e080 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1e090 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
1e0a0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
1e0b0 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
1e0c0 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
1e0d0 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
1e0e0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
1e0f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1e100 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
1e110 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
1e120 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
1e130 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e140 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e150 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54  QLITE_DELETE, zT
1e160 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  ab, 0, zDb) ){. 
1e170 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
1e180 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  rop_index;.    }
1e190 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1e1a0 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63  EMPDB && iDb ) c
1e1b0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1e1c0 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  P_TEMP_INDEX;.  
1e1d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e1e0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
1e1f0 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  ode, pIndex->zNa
1e200 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
1e210 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
1e220 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1e230 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1e240 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
1e250 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
1e260 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e  ove the index an
1e270 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  d from the maste
1e280 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d  r table */.  v =
1e290 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1e2a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1e2b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1e2c0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1e2d0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
1e2e0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e  b);.    sqlite3N
1e2f0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1e300 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54  e,.       "DELET
1e310 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
1e320 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74  RE name=%Q AND t
1e330 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20  ype='index'",.  
1e340 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1e350 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54  ].zDbSName, MAST
1e360 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78 2d  ER_NAME, pIndex-
1e370 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
1e380 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
1e390 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
1e3a0 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e   iDb, "idx", pIn
1e3b0 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  dex->zName);.   
1e3c0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1e3d0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1e3e0 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f  );.    destroyRo
1e3f0 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70  otPage(pParse, p
1e400 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62  Index->tnum, iDb
1e410 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e420 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
1e430 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30  ropIndex, iDb, 0
1e440 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  , 0, pIndex->zNa
1e450 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69  me, 0);.  }..exi
1e460 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20  t_drop_index:.  
1e470 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1e480 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
1e490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79  .}../*.** pArray
1e4a0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1e4b0 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a   an array of obj
1e4c0 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63  ects. Each objec
1e4d0 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
1e4e0 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
1e4f0 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73  es in size. This
1e500 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71   routine uses sq
1e510 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29  lite3DbRealloc()
1e520 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68  .** to extend th
1e530 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  e array so that 
1e540 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66  there is space f
1e550 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20  or a new object 
1e560 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a  at the end..**.*
1e570 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
1e580 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1e590 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e  *pnEntry contain
1e5a0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  s the current si
1e5b0 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72  ze of.** the arr
1e5c0 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d  ay (in entries -
1e5d0 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   so the allocati
1e5e0 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79  on is ((*pnEntry
1e5f0 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74  ) * szEntry) byt
1e600 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e  es.** in total).
1e610 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1e620 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65  alloc() is succe
1e630 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e  ssful (i.e. if n
1e640 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  o OOM condition 
1e650 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20  occurs), the.** 
1e660 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1e670 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  for the new obje
1e680 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70  ct is zeroed, *p
1e690 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74  nEntry updated t
1e6a0 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65  o.** reflect the
1e6b0 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65   new size of the
1e6c0 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69   array and a poi
1e6d0 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
1e6e0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65  allocation.** re
1e6f0 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73  turned. *pIdx is
1e700 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
1e710 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72  x of the new arr
1e720 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73  ay entry in this
1e730 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   case..**.** Oth
1e740 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72  erwise, if the r
1e750 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20  ealloc() fails, 
1e760 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1e770 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d  -1, *pnEntry rem
1e780 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  ains.** unchange
1e790 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20  d and a copy of 
1e7a0 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e  pArray returned.
1e7b0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
1e7c0 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1e7d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1e7e0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1e7f0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1e800 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1e810 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
1e820 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
1e830 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
1e840 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
1e850 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
1e860 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
1e870 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
1e880 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
1e890 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20   int *pnEntry,  
1e8a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e8b0 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c  objects currentl
1e8c0 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y in use */.  in
1e8d0 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  t *pIdx         
1e8e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64  /* Write the ind
1e8f0 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74  ex of a new slot
1e900 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   here */.){.  ch
1e910 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  ar *z;.  int n =
1e920 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28   *pnEntry;.  if(
1e930 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20   (n & (n-1))==0 
1e940 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  ){.    int sz = 
1e950 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e  (n==0) ? 1 : 2*n
1e960 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77  ;.    void *pNew
1e970 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1e980 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20  loc(db, pArray, 
1e990 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20  sz*szEntry);.   
1e9a0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1e9b0 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31        *pIdx = -1
1e9c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1e9d0 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Array;.    }.   
1e9e0 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a   pArray = pNew;.
1e9f0 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a    }.  z = (char*
1ea00 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65  )pArray;.  memse
1ea10 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79  t(&z[n * szEntry
1ea20 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
1ea30 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b    *pIdx = n;.  +
1ea40 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
1ea50 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
1ea60 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
1ea70 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1ea80 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
1ea90 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
1eaa0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1eab0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
1eac0 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
1ead0 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
1eae0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
1eaf0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
1eb00 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72  IdListAppend(Par
1eb10 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
1eb20 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1eb30 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c   *pToken){.  sql
1eb40 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1eb50 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
1eb60 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1eb70 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1eb80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1eb90 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1eba0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1ebb0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1ebc0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1ebd0 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1ebe0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1ebf0 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1ec00 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1ec10 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1ec20 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1ec30 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1ec40 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1ec50 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1ec60 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1ec70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1ec80 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1ec90 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1eca0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ecb0 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
1ecc0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
1ecd0 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  ECT && pList->a[
1ece0 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
1ecf0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
1ed00 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
1ed10 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d  oid*)pList->a[i]
1ed20 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  .zName, pToken);
1ed30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
1ed40 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1ed50 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1ed60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1ed70 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1ed80 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1ed90 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1eda0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1edb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1edc0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1edd0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1ede0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1edf0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1ee00 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1ee10 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1ee20 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1ee30 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
1ee40 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1ee50 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1ee60 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1ee70 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1ee80 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1ee90 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1eea0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1eeb0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1eec0 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1eed0 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1eee0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1eef0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1ef00 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1ef10 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1ef20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1ef30 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1ef40 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1ef50 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1ef60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1ef70 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
1ef80 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1ef90 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1efa0 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1efb0 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1efc0 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1efd0 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1efe0 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1eff0 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1f000 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1f010 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1f020 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1f030 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1f040 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1f050 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1f060 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1f070 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1f080 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1f090 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1f0a0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1f0b0 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1f0c0 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1f0d0 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1f0e0 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1f0f0 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1f100 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1f110 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1f120 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1f130 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1f140 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1f150 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1f160 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1f170 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1f180 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1f190 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1f1a0 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1f1b0 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1f1c0 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1f1d0 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1f1e0 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1f1f0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1f200 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
1f210 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
1f220 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
1f230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
1f240 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
1f250 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
1f260 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1f270 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
1f280 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
1f290 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1f2a0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1f2b0 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
1f2c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1f2d0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1f2e0 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1f2f0 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1f300 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1f310 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1f320 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1f330 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1f340 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1f350 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1f360 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1f370 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1f380 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1f390 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1f3a0 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1f3b0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1f3c0 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1f3d0 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1f3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1f3f0 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1f400 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1f410 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1f420 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1f430 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1f440 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1f450 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1f460 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1f470 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1f480 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
1f490 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
1f4a0 2a 32 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  *2+nExtra;.    i
1f4b0 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
1f4c0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1f4d0 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1f4f0 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1f500 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1f510 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1f520 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1f530 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f540 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f550 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1f560 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
1f570 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
1f580 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
1f590 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
1f5a0 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
1f5b0 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
1f5c0 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
1f5d0 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
1f5e0 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  = nGot;.  }..  /
1f5f0 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1f600 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1f610 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1f620 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1f630 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1f640 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1f650 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1f660 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1f670 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1f680 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1f690 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1f6a0 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
1f6b0 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
1f6c0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
1f6d0 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
1f6e0 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
1f6f0 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
1f700 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
1f710 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
1f720 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
1f730 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
1f740 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
1f750 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
1f760 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f770 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
1f780 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
1f790 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
1f7a0 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
1f7b0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
1f7c0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
1f7d0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
1f7e0 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
1f7f0 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
1f800 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
1f810 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
1f820 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
1f830 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
1f840 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1f850 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
1f860 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
1f870 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
1f880 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
1f890 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1f8a0 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1f8b0 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
1f8c0 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
1f8d0 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
1f8e0 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
1f8f0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1f900 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
1f910 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
1f920 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
1f930 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
1f940 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
1f950 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
1f960 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
1f970 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1f980 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
1f990 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
1f9a0 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
1f9b0 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
1f9c0 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
1f9d0 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
1f9e0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
1f9f0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1fa00 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
1fa10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
1fa20 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
1fa30 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
1fa40 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
1fa50 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
1fa60 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
1fa70 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
1fa80 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
1fa90 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
1faa0 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
1fab0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
1fac0 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
1fad0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1fae0 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
1faf0 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
1fb00 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
1fb10 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
1fb20 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
1fb30 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
1fb40 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1fb50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fb60 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1fb70 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
1fb80 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
1fb90 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1fba0 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
1fbb0 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
1fbc0 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
1fbd0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1fbe0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1fbf0 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
1fc00 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
1fc10 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1fc20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
1fc30 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
1fc40 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
1fc50 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
1fc60 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
1fc70 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
1fc80 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
1fc90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fca0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1fcb0 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
1fcc0 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
1fcd0 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
1fce0 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
1fcf0 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
1fd00 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
1fd10 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
1fd20 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
1fd30 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1fd40 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
1fd50 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1fd60 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1fd70 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1fd80 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1fd90 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
1fda0 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
1fdb0 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
1fdc0 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
1fdd0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
1fde0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1fdf0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1fe00 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
1fe10 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
1fe20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
1fe30 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
1fe40 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1fe50 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1fe60 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
1fe70 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
1fe80 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
1fe90 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
1fea0 42 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  B */.  assert( d
1feb0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
1fec0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1fed0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1fee0 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
1fef0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1ff00 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1ff10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1ff20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1ff30 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 1;.    pList-
1ff40 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d  >nSrc = 1;.    m
1ff50 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
1ff60 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  0], 0, sizeof(pL
1ff70 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
1ff80 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75   pList->a[0].iCu
1ff90 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  rsor = -1;.  }el
1ffa0 73 65 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  se{.    pList = 
1ffb0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1ffc0 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
1ffd0 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
1ffe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
1fff0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
20000 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
20010 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
20020 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
20030 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
20040 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
20050 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
20060 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
20070 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
20080 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
20090 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
200a0 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70  atabase ){.    p
200b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
200c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
200d0 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
200e0 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
200f0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
20100 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
20110 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65  b, pTable);.  }e
20120 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  lse{.    pItem->
20130 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
20140 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
20150 20 70 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49   pTable);.    pI
20160 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
20170 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
20180 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
20190 20 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73   Assign VdbeCurs
201a0 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73  or index numbers
201b0 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   to all tables i
201c0 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76  n a SrcList.*/.v
201d0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
201e0 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
201f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
20200 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
20210 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
20220 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20230 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
20240 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d  pList || pParse-
20250 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20260 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  d );.  if( pList
20270 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   ){.    for(i=0,
20280 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
20290 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
202a0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
202b0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
202c0 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65  iCursor>=0 ) bre
202d0 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ak;.      pItem-
202e0 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  >iCursor = pPars
202f0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
20300 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
20310 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
20320 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
20330 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
20340 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
20350 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  t->pSrc);.      
20360 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
20370 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
20380 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e  ntire SrcList in
20390 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20  cluding all its 
203a0 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  substructure..*/
203b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
203c0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
203d0 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
203e0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
203f0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
20400 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
20410 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
20420 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
20430 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
20440 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  =0; i<pList->nSr
20450 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
20460 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
20470 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
20480 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73  Database);.    s
20490 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
204a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
204b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
204c0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  e(db, pItem->zAl
204d0 69 61 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ias);.    if( pI
204e0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
204f0 64 42 79 20 29 20 73 71 6c 69 74 65 33 44 62 46  dBy ) sqlite3DbF
20500 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75  ree(db, pItem->u
20510 31 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  1.zIndexedBy);. 
20520 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
20530 2e 69 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c  .isTabFunc ) sql
20540 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
20550 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31  te(db, pItem->u1
20560 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20  .pFuncArg);.    
20570 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
20580 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54  le(db, pItem->pT
20590 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ab);.    sqlite3
205a0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
205b0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
205c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
205d0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  rDelete(db, pIte
205e0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
205f0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
20600 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69  (db, pItem->pUsi
20610 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ng);.  }.  sqlit
20620 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
20630 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
20640 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
20650 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
20660 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
20670 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
20680 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
20690 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
206a0 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
206b0 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
206c0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
206d0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
206e0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
206f0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
20700 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
20710 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
20720 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
20730 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
20740 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
20750 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
20760 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
20770 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
20780 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
20790 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
207a0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
207b0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
207c0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
207d0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
207e0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
207f0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
20800 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
20810 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
20820 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
20830 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
20840 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
20850 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
20860 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
20870 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
20880 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
20890 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
208a0 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
208b0 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
208c0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
208d0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
208e0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
208f0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
20900 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
20910 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
20920 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
20930 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
20940 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
20950 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
20960 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
20970 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
20980 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
20990 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
209a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
209b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
209c0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
209d0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
209e0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
209f0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
20a00 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
20a10 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
20a20 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
20a30 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
20a40 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
20a50 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
20a60 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
20a70 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
20a80 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
20a90 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
20aa0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
20ab0 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
20ac0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
20ad0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
20ae0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
20af0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
20b00 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
20b10 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
20b20 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
20b30 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
20b40 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
20b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20b60 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
20b70 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
20b80 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
20b90 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
20ba0 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
20bb0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
20bc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
20bd0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
20be0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20bf0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
20c00 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
20c10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20c20 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
20c30 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
20c40 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
20c50 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
20c60 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
20c70 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
20c80 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
20c90 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
20ca0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
20cb0 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
20cc0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
20cd0 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  ( p==0 ){.    go
20ce0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
20cf0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rror;.  }.  asse
20d00 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b  rt( p->nSrc>0 );
20d10 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  .  pItem = &p->a
20d20 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61  [p->nSrc-1];.  a
20d30 73 73 65 72 74 28 20 28 70 54 61 62 6c 65 3d 3d  ssert( (pTable==
20d40 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65 3d 3d  0)==(pDatabase==
20d50 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
20d60 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
20d70 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d 30 20  || pDatabase!=0 
20d80 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  );.  if( IN_RENA
20d90 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74  ME_OBJECT && pIt
20da0 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
20db0 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d   Token *pToken =
20dc0 20 28 41 4c 57 41 59 53 28 70 44 61 74 61 62 61   (ALWAYS(pDataba
20dd0 73 65 29 20 26 26 20 70 44 61 74 61 62 61 73 65  se) && pDatabase
20de0 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61 73 65  ->z) ? pDatabase
20df0 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 73   : pTable;.    s
20e00 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
20e10 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70 49 74  nMap(pParse, pIt
20e20 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65  em->zName, pToke
20e30 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
20e40 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
20e50 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
20e60 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
20e70 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
20e80 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
20e90 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
20ea0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
20eb0 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
20ec0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
20ed0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
20ee0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
20ef0 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
20f00 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
20f10 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
20f20 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
20f30 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
20f40 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
20f50 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
20f60 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
20f70 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
20f80 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
20f90 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
20fa0 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
20fb0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
20fc0 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
20fd0 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
20fe0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
20ff0 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
21000 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
21010 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
21020 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
21030 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
21040 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
21050 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
21060 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
21070 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
21080 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 49 6e  ;.  if( p && pIn
21090 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a  dexedBy->n>0 ){.
210a0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
210b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
210c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
210d0 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  Src>0 );.    pIt
210e0 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
210f0 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  rc-1];.    asser
21100 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74  t( pItem->fg.not
21110 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20  Indexed==0 );.  
21120 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
21130 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d  >fg.isIndexedBy=
21140 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
21150 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
21160 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
21170 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e  if( pIndexedBy->
21180 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65  n==1 && !pIndexe
21190 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  dBy->z ){.      
211a0 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45  /* A "NOT INDEXE
211b0 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75  D" clause was su
211c0 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73  pplied. See pars
211d0 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e.y .      ** co
211e0 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64  nstruct "indexed
211f0 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c  _opt" for detail
21200 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  s. */.      pIte
21210 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
21220 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
21230 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31  .      pItem->u1
21240 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71  .zIndexedBy = sq
21250 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
21260 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
21270 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
21280 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e    pItem->fg.isIn
21290 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20  dexedBy = 1;.   
212a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
212b0 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  Add the list of 
212c0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
212d0 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ts to the SrcLis
212e0 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a  t entry for a.**
212f0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75   table-valued-fu
21300 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
21310 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75  sqlite3SrcListFu
21320 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50  ncArgs(Parse *pP
21330 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
21340 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
21350 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
21360 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21370 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
21380 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
21390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
213a0 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
213b0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
213c0 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69  ert( pItem->fg.i
213d0 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b  sIndexedBy==0 );
213e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
213f0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
21400 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
21410 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20  ->u1.pFuncArg = 
21420 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d  pList;.    pItem
21430 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d  ->fg.isTabFunc =
21440 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
21450 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21460 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
21470 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  b, pList);.  }.}
21480 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69  ../*.** When bui
21490 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20  lding up a FROM 
214a0 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61  clause in the pa
214b0 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f  rser, the join o
214c0 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e  perator.** is in
214d0 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64  itially attached
214e0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65   to the left ope
214f0 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63  rand.  But the c
21500 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  ode generator.**
21510 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69   expects the joi
21520 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65  n operator to be
21530 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70   on the right op
21540 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75  erand.  This rou
21550 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61  tine.** Shifts a
21560 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  ll join operator
21570 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  s from left to r
21580 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69  ight for an enti
21590 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73  re FROM.** claus
215a0 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  e..**.** Example
215b0 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f  : Suppose the jo
215c0 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a  in is like this:
215d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
215e0 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73   A natural cross
215f0 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68   join B.**.** Th
21600 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e  e operator is "n
21610 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
21620 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42  n".  The A and B
21630 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74   operands are st
21640 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b  ored.** in p->a[
21650 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20  0] and p->a[1], 
21660 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54  respectively.  T
21670 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61  he parser initia
21680 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  lly stores the.*
21690 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  * operator with 
216a0 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  A.  This routine
216b0 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65   shifts that ope
216c0 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e  rator over to B.
216d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
216e0 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
216f0 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29  Type(SrcList *p)
21700 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
21710 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
21720 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
21730 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
21740 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[i].fg.jointyp
21750 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67  e = p->a[i-1].fg
21760 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
21770 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e  .    p->a[0].fg.
21780 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
21790 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
217a0 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
217b0 72 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  r a BEGIN statem
217c0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
217d0 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
217e0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
217f0 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
21800 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21810 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
21820 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
21830 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
21840 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
21850 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
21860 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
21870 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
21880 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
21890 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
218a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
218b0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
218c0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
218d0 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
218e0 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
218f0 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
21900 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21910 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
21920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
21940 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
21950 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
21960 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
21970 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
21980 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
21990 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
219a0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp0(v, OP_Auto
219b0 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Commit);.}../*.*
219c0 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
219d0 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49  code for a COMMI
219e0 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74  T or ROLLBACK st
219f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65  atement..** Code
21a00 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73   for ROLLBACK is
21a10 20 67 65 6e 65 72 61 74 65 64 20 69 66 20 65 54   generated if eT
21a20 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b  ype==TK_ROLLBACK
21a30 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
21a40 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65  code is generate
21a50 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a  d for a COMMIT..
21a60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
21a70 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  ndTransaction(Pa
21a80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
21a90 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20   eType){.  Vdbe 
21aa0 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c  *v;.  int isRoll
21ab0 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  back;..  assert(
21ac0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
21ad0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
21ae0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
21af0 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d  t( eType==TK_COM
21b00 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  MIT || eType==TK
21b10 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54  _END || eType==T
21b20 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  K_ROLLBACK );.  
21b30 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79  isRollback = eTy
21b40 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b  pe==TK_ROLLBACK;
21b50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
21b60 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
21b70 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
21b80 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f  ON, .       isRo
21b90 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41  llback ? "ROLLBA
21ba0 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20  CK" : "COMMIT", 
21bb0 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
21bc0 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
21bd0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
21be0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
21bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
21c00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
21c10 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52  toCommit, 1, isR
21c20 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a  ollback);.  }.}.
21c30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
21c40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
21c50 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
21c60 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f  n it parses a co
21c70 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c  mmand to create,
21c80 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72  .** release or r
21c90 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73  ollback an SQL s
21ca0 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f  avepoint. .*/.vo
21cb0 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  id sqlite3Savepo
21cc0 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
21cd0 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e  e, int op, Token
21ce0 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
21cf0 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
21d00 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
21d10 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
21d20 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
21d30 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
21d40 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
21d50 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
21d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
21d70 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74  ORIZATION.    st
21d80 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
21d90 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b  * const az[] = {
21da0 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
21db0 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
21dc0 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
21dd0 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
21de0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
21df0 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
21e00 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
21e10 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
21e20 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
21e30 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
21e40 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
21e50 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
21e60 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
21e70 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
21e80 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
21e90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
21ea0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21eb0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21ec0 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
21ed0 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
21ee0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
21ef0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
21f00 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
21f10 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
21f20 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
21f30 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
21f40 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
21f50 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
21f60 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
21f70 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
21f80 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
21f90 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
21fa0 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
21fb0 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
21fc0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21fd0 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
21fe0 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
21ff0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
22000 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
22010 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20  Btree *pBt;.    
22020 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
22030 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
22040 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22050 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
22060 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22070 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
22080 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22090 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
220a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
220b0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
220c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
220d0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
220e0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
220f0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
22100 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70  >pVfs, 0, db, &p
22110 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20  Bt, 0, flags);. 
22120 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
22140 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
22150 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
22160 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
22170 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
22180 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
22190 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
221a0 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
221b0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
221c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
221d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
221e0 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74  aDb[1].pBt = pBt
221f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
22200 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
22210 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
22220 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
22230 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
22240 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
22250 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20  agesize, -1, 0) 
22260 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22270 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
22280 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22290 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
222a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   0;.}../*.** Rec
222b0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
222c0 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
222d0 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  kie will need to
222e0 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20   be verified.** 
222f0 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44 62  for database iDb
22300 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61  .  The code to a
22310 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74  ctually verify t
22320 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
22330 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61  .** will occur a
22340 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22350 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20   top-level VDBE 
22360 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  and will be gene
22370 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20  rated.** later, 
22380 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  by sqlite3Finish
22390 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69  Coding()..*/.voi
223a0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
223b0 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20  ifySchema(Parse 
223c0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62  *pParse, int iDb
223d0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
223e0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
223f0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
22400 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  rse);..  assert(
22410 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70   iDb>=0 && iDb<p
22420 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29  Parse->db->nDb )
22430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
22440 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
22450 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
22460 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
22470 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
22480 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73  TACHED+2 );.  as
22490 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
224a0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61  emaMutexHeld(pPa
224b0 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29  rse->db, iDb, 0)
224c0 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
224d0 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
224e0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
224f0 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
22500 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
22510 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
22520 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
22530 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
22540 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22550 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
22560 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
22570 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22580 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62   If argument zDb
22590 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63   is NULL, then c
225a0 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56  all sqlite3CodeV
225b0 65 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f  erifySchema() fo
225c0 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63  r each .** attac
225d0 68 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74  hed database. Ot
225e0 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20  herwise, invoke 
225f0 69 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  it for the datab
22600 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e  ase named zDb on
22610 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
22620 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
22630 65 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  edSchema(Parse *
22640 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
22650 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
22660 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
22670 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
22680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
22690 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
226a0 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
226b0 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
226c0 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20  b->pBt && (!zDb 
226d0 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  || 0==sqlite3Str
226e0 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a  ICmp(zDb, pDb->z
226f0 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  DbSName)) ){.   
22700 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
22710 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
22720 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
22730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
22740 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
22750 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
22760 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
22770 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
22780 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
22790 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
227a0 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
227b0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
227c0 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
227d0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
227e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
227f0 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
22800 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
22810 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
22820 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
22830 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
22840 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
22850 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
22860 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
22870 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
22880 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
22890 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
228a0 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
228b0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
228c0 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
228d0 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
228e0 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
228f0 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
22900 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
22910 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
22920 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
22930 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
22940 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
22950 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
22960 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
22970 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
22980 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
22990 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
229a0 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
229b0 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
229c0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
229d0 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
229e0 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
229f0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
22a00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
22a10 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
22a20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
22a30 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
22a40 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
22a50 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
22a60 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
22a70 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
22a80 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
22a90 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
22aa0 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
22ab0 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
22ac0 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
22ad0 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
22ae0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
22af0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
22b00 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
22b10 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
22b20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
22b30 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
22b40 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
22b50 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
22b60 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
22b70 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
22b80 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
22b90 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
22ba0 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
22bb0 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
22bc0 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
22bd0 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
22be0 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
22bf0 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
22c00 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
22c10 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
22c20 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
22c30 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
22c40 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
22c50 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
22c60 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
22c70 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
22c80 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
22c90 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
22ca0 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
22cb0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
22cc0 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
22cd0 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
22ce0 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
22cf0 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
22d00 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
22d10 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
22d20 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
22d30 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
22d40 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
22d50 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
22d60 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
22d70 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
22d80 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
22d90 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
22da0 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
22db0 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
22dc0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
22dd0 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
22de0 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
22df0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
22e00 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
22e10 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
22e20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
22e30 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
22e40 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
22e50 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
22e60 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
22e70 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
22e80 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
22e90 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
22ea0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
22eb0 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
22ec0 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
22ed0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
22ee0 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
22ef0 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
22f00 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
22f10 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
22f20 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
22f30 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
22f40 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
22f50 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
22f60 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
22f70 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
22f80 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
22f90 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
22fa0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
22fb0 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
22fc0 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
22fd0 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
22fe0 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
22ff0 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
23000 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
23010 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
23020 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
23030 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
23040 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
23050 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
23060 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
23070 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
23080 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
23090 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
230a0 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
230b0 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
230c0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
230d0 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
230e0 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
230f0 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
23100 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
23110 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
23120 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
23130 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
23140 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
23150 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
23160 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
23170 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
23180 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
23190 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
231a0 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
231b0 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
231c0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
231d0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
231e0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
231f0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
23200 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
23210 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
23220 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
23230 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
23240 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
23250 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
23260 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
23270 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
23280 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
23290 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
232a0 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
232b0 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
232c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
232d0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
232e0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
232f0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
23300 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
23310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
23320 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
23330 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
23340 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
23350 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23360 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29  eP5(v, p5Errmsg)
23370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
23380 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
23390 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
233a0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
233b0 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f  nt violation..*/
233c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
233d0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  queConstraint(. 
233e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
233f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
23400 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
23410 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
23420 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
23430 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
23440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
23450 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72  dex that trigger
23460 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
23470 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
23480 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Err;.  int j;.  
23490 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b  StrAccum errMsg;
234a0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
234b0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a   pIdx->pTable;..
234c0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
234d0 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70  mInit(&errMsg, p
234e0 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c  Parse->db, 0, 0,
234f0 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64   200);.  if( pId
23500 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
23510 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
23520 70 70 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20  ppendf(&errMsg, 
23530 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49  "index '%q'", pI
23540 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  dx->zName);.  }e
23550 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  lse{.    for(j=0
23560 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
23570 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; j++){.      c
23580 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20  har *zCol;.     
23590 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
235a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b  iColumn[j]>=0 );
235b0 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54  .      zCol = pT
235c0 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  ab->aCol[pIdx->a
235d0 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d  iColumn[j]].zNam
235e0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29  e;.      if( j )
235f0 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
23600 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
23610 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
23620 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61  ite3_str_appenda
23630 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62  ll(&errMsg, pTab
23640 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
23650 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
23660 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c  nd(&errMsg, ".",
23670 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
23680 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
23690 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b  (&errMsg, zCol);
236a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72  .    }.  }.  zEr
236b0 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
236c0 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
236d0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
236e0 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
236f0 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
23700 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
23710 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
23720 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
23730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
23750 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23760 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
23770 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
23780 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
23790 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
237a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
237b0 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
237c0 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
237d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
237e0 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
237f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23800 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23810 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
23820 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
23830 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
23840 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
23850 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
23870 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
23880 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
23890 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
238a0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
238b0 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
238c0 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
238d0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
238e0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
238f0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
23900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23910 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
23920 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
23930 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
23940 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
23950 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
23960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
23970 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
23980 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
23990 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
239a0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
239b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
239c0 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
239d0 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
239e0 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
239f0 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
23a00 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
23a30 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
23a40 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
23a50 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
23a60 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
23a70 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
23a80 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
23a90 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
23aa0 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
23ab0 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
23ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
23ad0 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
23ae0 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
23af0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
23b00 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
23b10 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
23b20 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
23b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
23b40 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
23b50 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
23b60 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
23b70 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
23b80 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
23b90 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
23ba0 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
23bb0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
23bc0 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
23bd0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
23be0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
23bf0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
23c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23c10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23c20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
23c30 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
23c40 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
23c50 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
23c60 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
23c70 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
23c80 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
23c90 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
23ca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
23cb0 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
23cc0 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
23cd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
23ce0 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
23cf0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
23d00 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
23d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23d20 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
23d30 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
23d40 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
23d50 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
23d60 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
23d70 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
23d80 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
23d90 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
23da0 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
23db0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
23dc0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
23dd0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
23de0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
23df0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23e00 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
23e10 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
23e20 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
23e30 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
23e40 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
23e50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
23e60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
23e70 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
23e80 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
23e90 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
23ea0 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
23eb0 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
23ec0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
23ed0 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
23ee0 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
23ef0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
23f00 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
23f10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
23f20 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
23f30 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
23f40 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
23f50 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
23f60 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
23f70 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f90 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
23fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23fd0 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
23fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
23ff0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
24000 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
24010 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
24020 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24040 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
24050 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
24060 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
24090 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
240a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
240b0 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
240c0 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
240d0 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
240e0 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
240f0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
24100 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
24110 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
24120 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
24130 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
24140 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
24150 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
24160 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
24170 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
24180 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
24190 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
241a0 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
241b0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
241c0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
241d0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
241e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
241f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
24200 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
24210 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
24220 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
24250 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
24260 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
24270 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
24280 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
24290 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
242a0 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
242b0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
242c0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
242d0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
242e0 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
242f0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
24300 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
24310 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
24320 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
24330 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
24340 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
24350 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
24360 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
24370 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
24380 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
24390 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
243a0 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
243b0 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
243c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
243d0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
243e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
243f0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
24400 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
24410 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
24420 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
24430 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
24440 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
24450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24460 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
24470 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
24480 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
24490 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
244b0 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
244c0 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
244d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
244e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
244f0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
24500 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
24510 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
24520 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
24530 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
24540 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
24550 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
24560 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
24570 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
24580 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245a0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
245b0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
245c0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
245d0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
245e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
245f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
24600 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
24610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24620 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
24630 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
24640 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
24650 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
24660 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
24670 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
24680 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
24690 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
246a0 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
246b0 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
246c0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
246d0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
246e0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
246f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
24700 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
24710 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
24720 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
24730 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
24740 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
24750 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
24760 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
24770 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
24780 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
24790 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
247a0 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
247b0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
247c0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
247d0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
247e0 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
247f0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
24800 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
24810 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
24820 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
24830 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
24840 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
24850 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
24860 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24870 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
24880 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
24890 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
248a0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
248b0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
248c0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
248d0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
248e0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
248f0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
24900 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
24910 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
24920 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
24930 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
24940 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
24950 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
24960 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
24970 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
24980 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
24990 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
249a0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
249b0 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
249c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
249d0 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
249e0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
249f0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
24a00 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
24a10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24a20 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
24a30 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
24a40 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
24a50 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
24a60 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
24a70 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
24a80 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
24a90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
24aa0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
24ab0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
24ac0 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
24ad0 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
24ae0 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
24af0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
24b00 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
24b10 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
24b20 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
24b30 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
24b40 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  x..**.** The cal
24b50 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b  ler should invok
24b60 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  e sqlite3KeyInfo
24b70 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72  Unref() on the r
24b80 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a  eturned object.*
24b90 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66 69  * when it has fi
24ba0 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e  nished using it.
24bb0 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
24bc0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
24bd0 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
24be0 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
24bf0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
24c00 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c  Col = pIdx->nCol
24c10 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20  umn;.  int nKey 
24c20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
24c30 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
24c40 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
24c50 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
24c60 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69  .  if( pIdx->uni
24c70 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
24c80 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
24c90 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
24ca0 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
24cb0 6c 2d 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  l-nKey);.  }else
24cc0 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  {.    pKey = sql
24cd0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
24ce0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
24cf0 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  l, 0);.  }.  if(
24d00 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
24d10 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
24d20 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
24d30 4b 65 79 29 20 29 3b 0a 20 20 20 20 66 6f 72 28  Key) );.    for(
24d40 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
24d50 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
24d60 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64  har *zColl = pId
24d70 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
24d80 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
24d90 69 5d 20 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69  i] = zColl==sqli
24da0 74 65 33 53 74 72 42 49 4e 41 52 59 20 3f 20 30  te3StrBINARY ? 0
24db0 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
24dc0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24dd0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
24de0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
24df0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
24e00 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
24e10 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
24e20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
24e30 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
24e40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
24e50 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
24e60 45 52 52 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f  ERROR_MISSING_CO
24e70 4c 4c 53 45 51 20 29 3b 0a 20 20 20 20 20 20 69  LLSEQ );.      i
24e80 66 28 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72  f( pIdx->bNoQuer
24e90 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
24ea0 2f 2a 20 44 65 61 63 74 69 76 61 74 65 20 74 68  /* Deactivate th
24eb0 65 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  e index because 
24ec0 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75  it contains an u
24ed0 6e 6b 6e 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67  nknown collating
24ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 71 75  .        ** sequ
24ef0 65 6e 63 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ence.  The only 
24f00 77 61 79 20 74 6f 20 72 65 61 63 74 69 76 65 20  way to reactive 
24f10 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 6f 20  the index is to 
24f20 72 65 6c 6f 61 64 20 74 68 65 0a 20 20 20 20 20  reload the.     
24f30 20 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41     ** schema.  A
24f40 64 64 69 6e 67 20 74 68 65 20 6d 69 73 73 69 6e  dding the missin
24f50 67 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  g collating sequ
24f60 65 6e 63 65 20 6c 61 74 65 72 20 64 6f 65 73 20  ence later does 
24f70 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  not.        ** r
24f80 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64 65  eactive the inde
24f90 78 2e 20 20 54 68 65 20 61 70 70 6c 69 63 61 74  x.  The applicat
24fa0 69 6f 6e 20 68 61 64 20 74 68 65 20 63 68 61 6e  ion had the chan
24fb0 63 65 20 74 6f 20 72 65 67 69 73 74 65 72 0a 20  ce to register. 
24fc0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 69         ** the mi
24fd0 73 73 69 6e 67 20 69 6e 64 65 78 20 75 73 69 6e  ssing index usin
24fe0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d  g the collation-
24ff0 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e  needed callback.
25000 20 20 46 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a    For.        **
25010 20 73 69 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c   simplicity, SQL
25020 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76  ite will not giv
25030 65 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  e the applicatio
25040 6e 20 61 20 73 65 63 6f 6e 64 20 63 68 61 6e 63  n a second chanc
25050 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
25060 20 20 20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51        pIdx->bNoQ
25070 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
25080 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
25090 51 4c 49 54 45 5f 45 52 52 4f 52 5f 52 45 54 52  QLITE_ERROR_RETR
250a0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
250b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
250c0 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
250d0 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
250e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
250f0 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
25100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
25110 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
25120 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
25130 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
25140 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
25150 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
25160 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
25170 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
25180 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
25190 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
251a0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
251b0 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
251c0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
251d0 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
251e0 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
251f0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
25200 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
25210 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
25220 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
25230 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
25240 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
25250 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
25260 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
25270 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
25280 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
25290 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
252a0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
252b0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
252c0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
252d0 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
252e0 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
252f0 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
25300 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
25310 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
25320 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
25330 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
25340 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
25350 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
25360 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
25370 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
25380 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
25390 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
253a0 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
253b0 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
253c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
253d0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
253e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
253f0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
25400 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
25410 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
25420 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25430 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
25440 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
25450 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
25460 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
25470 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
25480 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
25490 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
254a0 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
254b0 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
254c0 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
254d0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
254e0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
254f0 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
25500 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
25510 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
25520 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
25530 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
25540 73 73 65 72 74 28 20 28 70 4e 65 77 21 3d 30 20  ssert( (pNew!=0 
25550 26 26 20 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20  && zName!=0) || 
25560 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25570 20 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   );..  if( db->m
25580 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
25590 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
255a0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
255b0 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
255c0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
255d0 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
255e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
255f0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
25600 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
25610 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
25620 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
25630 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
25640 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25650 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
25660 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
25670 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25680 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
25690 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
256a0 77 2d 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72  w->nCte].zCteErr
256b0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
256c0 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  nCte++;.  }..  r
256d0 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
256e0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f  *.** Free the co
256f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69  ntents of the Wi
25700 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  th object passed
25710 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
25720 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
25730 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65   sqlite3WithDele
25740 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
25750 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20  With *pWith){.  
25760 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
25770 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
25780 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
25790 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
257a0 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
257b0 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b   = &pWith->a[i];
257c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
257d0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
257e0 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20   pCte->pCols);. 
257f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
25800 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  ctDelete(db, pCt
25810 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  e->pSelect);.   
25820 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25830 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
25840 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25850 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25860 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  With);.  }.}.#en
25870 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
25880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29  SQLITE_OMIT_CTE)
25890 20 2a 2f 0a                                       */.