/ Hex Artifact Content
Login

Artifact 0bd866f9ac68f823d8a93e3c6464be687960132ac44c9435fd1a5e3b942086f9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
2120: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
2130: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
2140: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2150: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2160: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2170: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2180: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2190: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
21a0: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
21b0: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
21c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2200: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2220: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2230: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2240: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2250: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2260: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2270: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2280: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2290: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22a0: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
22b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
22c0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
22d0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
22e0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
22f0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
2300: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
2310: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2320: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2330: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2350: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2360: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2370: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2380: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2390: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
23a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
23b0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
23c0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
23d0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
23e0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
23f0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2400: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2410: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2420: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2430: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2440: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2450: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2460: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2470: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2480: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2490: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
24a0: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
24b0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
24c0: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
24d0: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
24e0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
24f0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2500: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2510: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2520: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2530: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2540: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2550: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2560: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2570: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2580: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2590: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
25a0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
25b0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
25c0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
25d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
25e0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
25f0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
2600: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
2610: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2620: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2630: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2640: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2660: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2670: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2680: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2690: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
26a0: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
26b0: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
26c0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
26d0: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
26e0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
26f0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
2700: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
2710: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2720: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2750: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2760: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2770: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2780: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2790: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
27a0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
27b0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
27c0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
27d0: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
27e0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
27f0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
2800: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
2810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2820: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
2830: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
2840: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71  ;.        p = sq
2850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2860: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2870: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
2880: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2890: 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20  p ) return p;.  
28a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28b0: 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49  /* Not found.  I
28c0: 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65  f the name we we
28d0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77  re looking for w
28e0: 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d  as temp.sqlite_m
28f0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  aster.    ** the
2900: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d  n change the nam
2910: 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70  e to sqlite_temp
2920: 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20  _master and try 
2930: 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
2940: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2950: 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  (zName, MASTER_N
2960: 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  AME)!=0 ) break;
2970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2980: 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61  _stricmp(zDataba
2990: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  se, db->aDb[1].z
29a0: 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72  DbSName)!=0 ) br
29b0: 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  eak;.    zName =
29c0: 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d   TEMP_MASTER_NAM
29d0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
29e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  0;.}../*.** Loca
29f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a10: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a20: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a30: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a50: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a60: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2a70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2a80: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2a90: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2aa0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ab0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2ac0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2ad0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2ae0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2af0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b00: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b10: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b20: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b30: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b40: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b50: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b60: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2b70: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2b80: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2b90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2ba0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2bb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2bd0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2be0: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2bf0: 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20  .  u32 flags,   
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43            /* LOC
2c10: 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41  ATE_VIEW or LOCA
2c20: 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f  TE_NOERR */.  co
2c30: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2c40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c50: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2c60: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c80: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
2c90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ca0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
2cb0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
2cc0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2cd0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2ce0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2cf0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2d00: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d10: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2d20: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2d30: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2d40: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2d50: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  L. */.  if( (db-
2d60: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
2d70: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
2d80: 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49  )==0 .   && SQLI
2d90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2da0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2db0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2dc0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2de0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2df0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2e00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e10: 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26   *zMsg = flags &
2e20: 20 4c 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22   LOCATE_VIEW ? "
2e30: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
2e40: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
2e50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e70: 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  E.    /* If zNam
2e80: 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65  e is the not the
2e90: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
2ea0: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63   in the schema c
2eb0: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
2ec0: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2ed0: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2ee0: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2ef0: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2f00: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ble that.    ** 
2f10: 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d  can be an eponym
2f20: 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
2f30: 65 2e 20 2a 2f 0a 20 20 20 20 4d 6f 64 75 6c 65  e. */.    Module
2f40: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
2f50: 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  *)sqlite3HashFin
2f60: 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20  d(&db->aModule, 
2f70: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
2f80: 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71 6c 69 74  pMod==0 && sqlit
2f90: 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 4e 61 6d  e3_strnicmp(zNam
2fa0: 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c 20 37 29  e, "pragma_", 7)
2fb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  ==0 ){.      pMo
2fc0: 64 20 3d 20 73 71 6c 69 74 65 33 50 72 61 67 6d  d = sqlite3Pragm
2fd0: 61 56 74 61 62 52 65 67 69 73 74 65 72 28 64 62  aVtabRegister(db
2fe0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , zName);.    }.
2ff0: 20 20 20 20 69 66 28 20 70 4d 6f 64 20 26 26 20      if( pMod && 
3000: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
3010: 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74 28 70 50  mousTableInit(pP
3020: 61 72 73 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20  arse, pMod) ){. 
3030: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64       return pMod
3040: 2d 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 7d  ->pEpoTab;.    }
3050: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
3060: 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 54 45 5f  (flags & LOCATE_
3070: 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a 20 20 20  NOERR)==0 ){.   
3080: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3090: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
30b0: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d   "%s: %s.%s", zM
30c0: 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d  sg, zDbase, zNam
30d0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
30e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3100: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3110: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
3120: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63  .      pParse->c
3130: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
3140: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
3150: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3160: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
3170: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a   identified by *
3180: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
3190: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
31a0: 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  d sqlite3LocateT
31b0: 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66  able(). The diff
31c0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
31d0: 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  * sqlite3LocateT
31e0: 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20  able() and this 
31f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74  function is that
3200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
3210: 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20  estricts.** the 
3220: 73 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61  search to schema
3230: 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66   (p->pSchema) if
3240: 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e   it is not NULL.
3250: 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20   p->pSchema may 
3260: 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69  be.** non-NULL i
3270: 66 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20  f it is part of 
3280: 61 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65  a view or trigge
3290: 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69  r program defini
32a0: 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c  tion. See.** sql
32b0: 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29  ite3FixSrcList()
32c0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
32d0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
32e0: 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a  ocateTableItem(.
32f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3300: 20 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 0a 20   .  u32 flags,. 
3310: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
3320: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
3330: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
3340: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
3350: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
3360: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
3370: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
3380: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
3390: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
33a0: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
33b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
33c0: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
33d0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
33e0: 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
33f0: 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61    zDb = p->zData
3400: 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  base;.  }.  retu
3410: 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  rn sqlite3Locate
3420: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 66 6c  Table(pParse, fl
3430: 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  ags, p->zName, z
3440: 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Db);.}../*.** Lo
3450: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
3460: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
3470: 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20  t describes .** 
3480: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
3490: 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  ex given the nam
34a0: 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a  e of that index.
34b0: 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20  ** and the name 
34c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34d0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
34e0: 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75  e index..** Retu
34f0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
3500: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
3510: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
3520: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
3530: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
3540: 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74  e.** table and t
3550: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  he first matchin
3560: 67 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72  g index is retur
3570: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
3580: 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63  ng.** for duplic
3590: 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  ate index names 
35a0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
35b0: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a  earch order is.*
35c0: 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  * TEMP first, th
35d0: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
35e0: 79 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  y auxiliary data
35f0: 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75  bases added.** u
3600: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
3610: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65  command..*/.Inde
3620: 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  x *sqlite3FindIn
3630: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
3640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3650: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
3660: 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  zDb){.  Index *p
3670: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
3680: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
3690: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
36a0: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
36b0: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
36c0: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
36d0: 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20  sert( zDb!=0 || 
36e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
36f0: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
3700: 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f  );.  for(i=OMIT_
3710: 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44  TEMPDB; i<db->nD
3720: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  b; i++){.    int
3730: 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31   j = (i<2) ? i^1
3740: 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68   : i;  /* Search
3750: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
3760: 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20  N */.    Schema 
3770: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
3780: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[j].pSchema;. 
3790: 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65     assert( pSche
37a0: 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44  ma );.    if( zD
37b0: 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  b && sqlite3StrI
37c0: 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62  Cmp(zDb, db->aDb
37d0: 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 20 29 20  [j].zDbSName) ) 
37e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
37f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3800: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
3810: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
3820: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
3830: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
3840: 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ash, zName);.   
3850: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
3860: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
3870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
3880: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
3890: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
38a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 72 65 65  void sqlite3Free
38b0: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
38c0: 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23 69  b, Index *p){.#i
38d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
38e0: 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c 69  T_ANALYZE.  sqli
38f0: 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53 61  te3DeleteIndexSa
3900: 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23 65  mples(db, p);.#e
3910: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45 78  ndif.  sqlite3Ex
3920: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
3930: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
3940: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
3950: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 61  tDelete(db, p->a
3960: 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  ColExpr);.  sqli
3970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
3980: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28  >zColAff);.  if(
3990: 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20   p->isResized ) 
39a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
39b0: 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 43  , (void *)p->azC
39c0: 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  oll);.#ifdef SQL
39d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
39e0: 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 71 6c 69  _OR_STAT4.  sqli
39f0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f  te3_free(p->aiRo
3a00: 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  wEst);.#endif.  
3a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3a20: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
3a30: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
3a40: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
3a50: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
3a60: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
3a70: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
3a80: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
3a90: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
3aa0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
3ab0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
3ac0: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
3ad0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
3ae0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3af0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
3b00: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
3b10: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
3b20: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
3b30: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
3b40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
3b50: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
3b60: 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70  Index;.  Hash *p
3b70: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3b80: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3b90: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3ba0: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3bb0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3bc0: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3bd0: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3be0: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3bf0: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30  ash, zIdxName, 0
3c00: 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
3c10: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69  pIndex) ){.    i
3c20: 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  f( pIndex->pTabl
3c30: 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65  e->pIndex==pInde
3c40: 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  x ){.      pInde
3c50: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3c60: 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  x = pIndex->pNex
3c70: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
3c80: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
3c90: 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61      /* Justifica
3ca0: 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29  tion of ALWAYS()
3cb0: 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73  ;  The index mus
3cc0: 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  t be on the list
3cd0: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64   of.      ** ind
3ce0: 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ices. */.      p
3cf0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
3d00: 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  e->pIndex;.     
3d10: 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
3d20: 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70  ) && p->pNext!=p
3d30: 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e  Index ){ p = p->
3d40: 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69  pNext; }.      i
3d50: 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70  f( ALWAYS(p && p
3d60: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29  ->pNext==pIndex)
3d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   ){.        p->p
3d80: 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70  Next = pIndex->p
3d90: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
3da0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
3db0: 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
3dc0: 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  dex);.  }.  db->
3dd0: 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c  mDbFlags |= DBFL
3de0: 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
3df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74  .}../*.** Look t
3e00: 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20  hrough the list 
3e10: 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  of open database
3e20: 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44   files in db->aD
3e30: 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e  b[] and if.** an
3e40: 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73  y have been clos
3e50: 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20  ed, remove them 
3e60: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20  from the list.  
3e70: 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a  Reallocate the.*
3e80: 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75  * db->aDb[] stru
3e90: 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c  cture to a small
3ea0: 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73  er size, if poss
3eb0: 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72  ible..**.** Entr
3ec0: 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20  y 0 (the "main" 
3ed0: 64 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e  database) and en
3ee0: 74 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70  try 1 (the "temp
3ef0: 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61  " database).** a
3f00: 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61  re never candida
3f10: 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f  tes for being co
3f20: 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  llapsed..*/.void
3f30: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
3f40: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71  DatabaseArray(sq
3f50: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
3f60: 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
3f70: 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  j=2; i<db->nDb; 
3f80: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
3f90: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
3fa0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
3fb0: 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20  pDb->pBt==0 ){. 
3fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3fd0: 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53  ee(db, pDb->zDbS
3fe0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62  Name);.      pDb
3ff0: 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a  ->zDbSName = 0;.
4000: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4010: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c      }.    if( j<
4020: 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61  i ){.      db->a
4030: 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  Db[j] = db->aDb[
4040: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b  i];.    }.    j+
4050: 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62  +;.  }.  db->nDb
4060: 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e   = j;.  if( db->
4070: 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44  nDb<=2 && db->aD
4080: 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b!=db->aDbStatic
4090: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64   ){.    memcpy(d
40a0: 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62  b->aDbStatic, db
40b0: 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28  ->aDb, 2*sizeof(
40c0: 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20  db->aDb[0]));.  
40d0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
40e0: 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20  db, db->aDb);.  
40f0: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
4100: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d  aDbStatic;.  }.}
4110: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
4120: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
4130: 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64   database at ind
4140: 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65  ex iDb.  Also re
4150: 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20  set the.** TEMP 
4160: 73 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73  schema.  The res
4170: 65 74 20 69 73 20 64 65 66 65 72 72 65 64 20 69  et is deferred i
4180: 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  f db->nSchemaLoc
4190: 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a  k is not zero..*
41a0: 2a 20 44 65 66 65 72 72 65 64 20 72 65 73 65 74  * Deferred reset
41b0: 73 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20  s may be run by 
41c0: 63 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62  calling with iDb
41d0: 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  <0..*/.void sqli
41e0: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
41f0: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
4200: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69  nt iDb){.  int i
4210: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
4220: 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66  db->nDb );..  if
4230: 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20  ( iDb>=0 ){.    
4240: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4250: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4260: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4270: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
4280: 64 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65  db, iDb, DB_Rese
4290: 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62  tWanted);.    Db
42a0: 53 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20  SetProperty(db, 
42b0: 31 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65  1, DB_ResetWante
42c0: 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46  d);.    db->mDbF
42d0: 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f  lags &= ~DBFLAG_
42e0: 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20  SchemaKnownOk;. 
42f0: 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   }..  if( db->nS
4300: 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  chemaLock==0 ){.
4310: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
4320: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4330: 20 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f      if( DbHasPro
4340: 70 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f  perty(db, i, DB_
4350: 52 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a  ResetWanted) ){.
4360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
4370: 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61  chemaClear(db->a
4380: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[i].pSchema);.
4390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
43a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  }.}../*.** Erase
43b0: 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f   all schema info
43c0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c  rmation from all
43d0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
43e0: 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a  ses (including.*
43f0: 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65  * "main" and "te
4400: 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c  mp") for a singl
4410: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
4420: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4430: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
4440: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
4450: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  n(sqlite3 *db){.
4460: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
4470: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
4480: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
4490: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
44a0: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
44b0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
44c0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
44d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62   ){.      if( db
44e0: 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30  ->nSchemaLock==0
44f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4500: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
4510: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4530: 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79     DbSetProperty
4540: 28 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74  (db, i, DB_Reset
4550: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  Wanted);.      }
4560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
4570: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44  >mDbFlags &= ~(D
4580: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
4590: 67 65 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  ge|DBFLAG_Schema
45a0: 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69  KnownOk);.  sqli
45b0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
45c0: 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(db);.  sqlite3
45d0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
45e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63  );.  if( db->nSc
45f0: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4600: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70     sqlite3Collap
4610: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
4620: 64 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  db);.  }.}../*.*
4630: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4640: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4650: 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a  commit occurs..*
4660: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
4670: 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
4680: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4690: 7b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  {.  db->mDbFlags
46a0: 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65   &= ~DBFLAG_Sche
46b0: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
46c0: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
46d0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
46e0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46f0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
4700: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
4710: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
4720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
4730: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4740: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4750: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4760: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4770: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4780: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4790: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
47a0: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
47b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
47c0: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
47d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
47e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47f0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
4800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4810: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
4820: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
4830: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4840: 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b  b, pCol->zColl);
4850: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4860: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4870: 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a  ble->aCol);.  }.
4880: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
4890: 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20  the memory data 
48a0: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
48b0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
48c0: 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20  iven.** Table.  
48d0: 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
48e0: 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74  ade to disk by t
48f0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
4900: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4910: 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65  just deletes the
4920: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
4930: 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e    It does not un
4940: 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c  link.** the tabl
4950: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
4960: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4970: 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f  able.  But it do
4980: 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65  es destroy.** me
4990: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
49a0: 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61  of the indices a
49b0: 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  nd foreign keys 
49c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
49d0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  .** the table..*
49e0: 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61  *.** The db para
49f0: 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61  meter is optiona
4a00: 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64  l.  It is needed
4a10: 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62   if the Table ob
4a20: 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e  ject .** contain
4a30: 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  s lookaside memo
4a40: 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65  ry.  (Table obje
4a50: 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d  cts in the schem
4a60: 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  a do not use.** 
4a70: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
4a80: 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d  , but some ephem
4a90: 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
4aa0: 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a  ts do.)  Or the.
4ab0: 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  ** db parameter 
4ac0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
4ad0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4ae0: 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  d to measure the
4af0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20   memory.** used 
4b00: 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  by the Table obj
4b10: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
4b20: 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  oid SQLITE_NOINL
4b30: 49 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28  INE deleteTable(
4b40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4b50: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49  le *pTable){.  I
4b60: 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70  ndex *pIndex, *p
4b70: 4e 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Next;..#ifdef SQ
4b80: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
4b90: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4ba0: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4bb0: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4bc0: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4bd0: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4be0: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4bf0: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4c00: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4c10: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4c20: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
4c30: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
4c40: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
4c50: 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  . */.  int nLook
4c60: 61 73 69 64 65 20 3d 20 30 3b 0a 20 20 69 66 28  aside = 0;.  if(
4c70: 20 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e   db && (pTable->
4c80: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
4c90: 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20  hemeral)==0 ){. 
4ca0: 20 20 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20     nLookaside = 
4cb0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
4cc0: 55 73 65 64 28 64 62 2c 20 30 29 3b 0a 20 20 7d  Used(db, 0);.  }
4cd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 65  .#endif..  /* De
4ce0: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
4cf0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4d00: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4d10: 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70    for(pIndex = p
4d20: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
4d30: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e  Index; pIndex=pN
4d40: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
4d50: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
4d60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
4d70: 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  dex->pSchema==pT
4d80: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 0a 20 20  able->pSchema.  
4d90: 20 20 20 20 20 20 20 7c 7c 20 28 49 73 56 69 72         || (IsVir
4da0: 74 75 61 6c 28 70 54 61 62 6c 65 29 20 26 26 20  tual(pTable) && 
4db0: 70 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21  pIndex->idxType!
4dc0: 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
4dd0: 41 50 50 44 45 46 29 20 29 3b 0a 20 20 20 20 69  APPDEF) );.    i
4de0: 66 28 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  f( (db==0 || db-
4df0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4e00: 29 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28  ) && !IsVirtual(
4e10: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  pTable) ){.     
4e20: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4e30: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4e40: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4e50: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4e60: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4e70: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4e80: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4e90: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4ea0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4eb0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4ec0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4ed0: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4ee0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4ef0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4f00: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4f10: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72 65 65  .    sqlite3Free
4f30: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
4f40: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
4f50: 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20  ete any foreign 
4f60: 6b 65 79 73 20 61 74 74 61 63 68 65 64 20 74 6f  keys attached to
4f70: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4f80: 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74    sqlite3FkDelet
4f90: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
4fa0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
4fb0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
4fc0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 23 69 66  itself..  */.#if
4fd0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4fe0: 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 69 66  E_NORMALIZE.  if
4ff0: 28 20 70 54 61 62 6c 65 2d 3e 70 43 6f 6c 48 61  ( pTable->pColHa
5000: 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sh ){.    sqlite
5010: 33 48 61 73 68 43 6c 65 61 72 28 70 54 61 62 6c  3HashClear(pTabl
5020: 65 2d 3e 70 43 6f 6c 48 61 73 68 29 3b 0a 20 20  e->pColHash);.  
5030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5040: 54 61 62 6c 65 2d 3e 70 43 6f 6c 48 61 73 68 29  Table->pColHash)
5050: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
5060: 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
5070: 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
5080: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  le);.  sqlite3Db
5090: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
50a0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  >zName);.  sqlit
50b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
50c0: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
50d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
50e0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
50f0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
5100: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5110: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
5120: 43 68 65 63 6b 29 3b 0a 23 69 66 6e 64 65 66 20  Check);.#ifndef 
5130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
5140: 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
5150: 65 33 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20  e3VtabClear(db, 
5160: 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  pTable);.#endif.
5170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5180: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
5190: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  /* Verify that n
51a0: 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  o lookaside memo
51b0: 72 79 20 77 61 73 20 75 73 65 64 20 62 79 20 73  ry was used by s
51c0: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a  chema tables */.
51d0: 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61    assert( nLooka
51e0: 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b  side==0 || nLook
51f0: 61 73 69 64 65 3d 3d 73 71 6c 69 74 65 33 4c 6f  aside==sqlite3Lo
5200: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30  okasideUsed(db,0
5210: 29 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ) );.}.void sqli
5220: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
5230: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
5240: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 2f 2a  e *pTable){.  /*
5250: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
5260: 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74  he table until t
5270: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
5280: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
5290: 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c   */.  if( !pTabl
52a0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  e ) return;.  if
52b0: 28 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70  ( ((!db || db->p
52c0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20  nBytesFreed==0) 
52d0: 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54  && (--pTable->nT
52e0: 61 62 52 65 66 29 3e 30 29 20 29 20 72 65 74 75  abRef)>0) ) retu
52f0: 72 6e 3b 0a 20 20 64 65 6c 65 74 65 54 61 62 6c  rn;.  deleteTabl
5300: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d  e(db, pTable);.}
5310: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  .../*.** Unlink 
5320: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
5330: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
5340: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
5350: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
5360: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
5370: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
5380: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
5390: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
53a0: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
53b0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
53c0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
53d0: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
53e0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
53f0: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
5400: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
5410: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
5420: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
5430: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
5440: 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
5450: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
5460: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
5470: 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73   0) );.  testcas
5480: 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  e( zTabName[0]==
5490: 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65  0 );  /* Zero-le
54a0: 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73  ngth table names
54b0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a   are allowed */.
54c0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
54d0: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
54e0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
54f0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
5500: 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c  lHash, zTabName,
5510: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65   0);.  sqlite3De
5520: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29  leteTable(db, p)
5530: 3b 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73  ;.  db->mDbFlags
5540: 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d   |= DBFLAG_Schem
5550: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
5560: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
5570: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
5580: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
5590: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
55a0: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70  at.** token.  Sp
55b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
55c0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
55d0: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
55e0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
55f0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
5600: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
5610: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
5620: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61  .**.** Any quota
5630: 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20  tion marks (ex: 
5640: 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c   "name", 'name',
5650: 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d   [name], or `nam
5660: 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72  e`) that.** surr
5670: 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66  ound the body of
5680: 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72   the token are r
5690: 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f  emoved..**.** To
56a0: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
56b0: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
56c0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
56d0: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
56e0: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
56f0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
5700: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
5710: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
5720: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
5730: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
5740: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
5750: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
5760: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71  NameFromToken(sq
5770: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5780: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
5790: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
57a0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
57b0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
57c0: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
57d0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
57e0: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
57f0: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
5800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
5810: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
5820: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
5830: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71  *.** Open the sq
5840: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
5850: 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  e stored in data
5860: 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20  base number iDb 
5870: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20  for.** writing. 
5880: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
5890: 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72  ned using cursor
58a0: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
58b0: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
58c0: 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74  le(Parse *p, int
58d0: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
58e0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
58f0: 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  e(p);.  sqlite3T
5900: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c  ableLock(p, iDb,
5910: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c   MASTER_ROOT, 1,
5920: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 29 3b 0a 20   MASTER_NAME);. 
5930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5940: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
5950: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
5960: 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a  _ROOT, iDb, 5);.
5970: 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30    if( p->nTab==0
5980: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20   ){.    p->nTab 
5990: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
59a0: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d  * Parameter zNam
59b0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75  e points to a nu
59c0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66  l-terminated buf
59d0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
59e0: 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
59f0: 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22  database ("main"
5a00: 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  , "temp" or the 
5a10: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5a20: 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a  hed db). This.**
5a30: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5a40: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
5a50: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
5a60: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
5a70: 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20  or.** -1 if the 
5a80: 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20  named db cannot 
5a90: 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
5aa0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
5ab0: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
5ac0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5ad0: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
5ae0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
5af0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5b00: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
5b10: 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
5b20: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
5b30: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
5b40: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
5b50: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
5b60: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
5b70: 63 6d 70 28 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  cmp(pDb->zDbSNam
5b80: 65 2c 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61  e, zName) ) brea
5b90: 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 22 6d 61 69  k;.      /* "mai
5ba0: 6e 22 20 69 73 20 61 6c 77 61 79 73 20 61 6e 20  n" is always an 
5bb0: 61 63 63 65 70 74 61 62 6c 65 20 61 6c 69 61 73  acceptable alias
5bc0: 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79   for the primary
5bd0: 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
5be0: 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20 68 61  ** even if it ha
5bf0: 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 75  s been renamed u
5c00: 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 43 4f  sing SQLITE_DBCO
5c10: 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e  NFIG_MAINDBNAME.
5c20: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d   */.      if( i=
5c30: 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =0 && 0==sqlite3
5c40: 5f 73 74 72 69 63 6d 70 28 22 6d 61 69 6e 22 2c  _stricmp("main",
5c50: 20 7a 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b   zName) ) break;
5c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5c70: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
5c80: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
5c90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
5ca0: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
5cb0: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
5cc0: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
5cd0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
5ce0: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
5cf0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
5d00: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
5d10: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
5d20: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
5d30: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
5d40: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
5d50: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
5d60: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5d70: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
5d80: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5d90: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5dc0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
5dd0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
5e00: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
5e10: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
5e20: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5e30: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5e40: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5e50: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
5e60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5e70: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
5e80: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
5e90: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5ea0: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
5eb0: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5ec0: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5ed0: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
5ee0: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5ef0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5f00: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5f10: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5f20: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5f30: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5f40: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
5f50: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5f60: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5f70: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5f80: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
5f90: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5fa0: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
5fb0: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
5fc0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5fd0: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
5fe0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5ff0: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
6000: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
6010: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6020: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
6030: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
6040: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
6050: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
6060: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6070: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6080: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
6090: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
60a0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
60b0: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
60c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
60d0: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
60e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
60f0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
6100: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
6110: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
6120: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
6130: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
6140: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
6150: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
6160: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6170: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
6180: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
6190: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
61a0: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
61b0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
61c0: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
61d0: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
61e0: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
6210: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
6220: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
6230: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
6240: 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 32 21   assert( pName2!
6250: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 61 6d  =0 );.  if( pNam
6260: 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69  e2->n>0 ){.    i
6270: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
6280: 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74   ) {.      sqlit
6290: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62a0: 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61  e, "corrupt data
62b0: 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65  base");.      re
62c0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
62d0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
62e0: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
62f0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
6300: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
6310: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
6320: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6330: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
6340: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
6350: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
6360: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
6370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6380: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
6390: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
63a0: 74 2e 62 75 73 79 20 7c 7c 20 49 4e 5f 52 45 4e  t.busy || IN_REN
63b0: 41 4d 45 5f 4f 42 4a 45 43 54 0a 20 20 20 20 20  AME_OBJECT.     
63c0: 20 20 20 20 20 20 20 20 7c 7c 20 28 64 62 2d 3e          || (db->
63d0: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
63e0: 47 5f 56 61 63 75 75 6d 29 21 3d 30 29 3b 0a 20  G_Vacuum)!=0);. 
63f0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
6400: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
6410: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
6420: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
6430: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66  }../*.** True if
6440: 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
6450: 5f 73 63 68 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f  _schema is ON.*/
6460: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 72 69 74  .int sqlite3Writ
6470: 61 62 6c 65 53 63 68 65 6d 61 28 73 71 6c 69 74  ableSchema(sqlit
6480: 65 33 20 2a 64 62 29 7b 0a 20 20 74 65 73 74 63  e3 *db){.  testc
6490: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
64a0: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
64b0: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
64c0: 73 69 76 65 29 29 3d 3d 30 20 29 3b 0a 20 20 74  sive))==0 );.  t
64d0: 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c  estcase( (db->fl
64e0: 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74  ags&(SQLITE_Writ
64f0: 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44  eSchema|SQLITE_D
6500: 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20  efensive))==.   
6510: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
6520: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 20 29  TE_WriteSchema )
6530: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  ;.  testcase( (d
6540: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6550: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
6560: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
6570: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
6580: 20 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76   SQLITE_Defensiv
6590: 65 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e );.  testcase(
65a0: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
65b0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
65c0: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
65d0: 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ))==.           
65e0: 20 20 20 20 28 53 51 4c 49 54 45 5f 57 72 69 74      (SQLITE_Writ
65f0: 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44  eSchema|SQLITE_D
6600: 65 66 65 6e 73 69 76 65 29 20 29 3b 0a 20 20 72  efensive) );.  r
6610: 65 74 75 72 6e 20 28 64 62 2d 3e 66 6c 61 67 73  eturn (db->flags
6620: 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  &(SQLITE_WriteSc
6630: 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65  hema|SQLITE_Defe
6640: 6e 73 69 76 65 29 29 3d 3d 53 51 4c 49 54 45 5f  nsive))==SQLITE_
6650: 57 72 69 74 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a  WriteSchema;.}..
6660: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6670: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
6680: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
6690: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
66a0: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
66b0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
66c0: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
66d0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
66e0: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
66f0: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
6700: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
6710: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
6720: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
6730: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
6740: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
6750: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
6760: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
6770: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
6780: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
6790: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
67a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
67b0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
67c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
67d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
67e0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
67f0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
6800: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
6810: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
6820: 26 26 20 73 71 6c 69 74 65 33 57 72 69 74 61 62  && sqlite3Writab
6830: 6c 65 53 63 68 65 6d 61 28 70 50 61 72 73 65 2d  leSchema(pParse-
6840: 3e 64 62 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  >db)==0.        
6850: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
6860: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
6870: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
6880: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6890: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
68a0: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
68b0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
68c0: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
68d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
68e0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
68f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6910: 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  n the PRIMARY KE
6920: 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  Y index of a tab
6930: 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  le.*/.Index *sql
6940: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
6950: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dex(Table *pTab)
6960: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20  {.  Index *p;.  
6970: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64  for(p=pTab->pInd
6980: 65 78 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d  ex; p && !IsPrim
6990: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20  aryKeyIndex(p); 
69a0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
69b0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
69c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
69d0: 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
69e0: 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  dx that correspo
69f0: 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20  nds to table.** 
6a00: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65  column iCol.  Re
6a10: 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66  turn -1 if not f
6a20: 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c  ound..*/.i16 sql
6a30: 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65  ite3ColumnOfInde
6a40: 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  x(Index *pIdx, i
6a50: 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  16 iCol){.  int 
6a60: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
6a70: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
6a80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  ++){.    if( iCo
6a90: 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  l==pIdx->aiColum
6aa0: 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69 3b  n[i] ) return i;
6ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
6ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
6ad0: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
6ae0: 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73  new table repres
6af0: 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f  entation in memo
6b00: 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  ry.  This is.** 
6b10: 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76  the first of sev
6b20: 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74  eral action rout
6b30: 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61  ines that get ca
6b40: 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65  lled in response
6b50: 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20  .** to a CREATE 
6b60: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6b70: 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c    In particular,
6b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6b90: 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72   called.** after
6ba0: 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22   seeing tokens "
6bb0: 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42  CREATE" and "TAB
6bc0: 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c  LE" and the tabl
6bd0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65  e name. The isTe
6be0: 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  mp.** flag is tr
6bf0: 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ue if the table 
6c00: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6c10: 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72   in the auxiliar
6c20: 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  y database.** fi
6c30: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
6c40: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
6c50: 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  se file.  This i
6c60: 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63  s normally the c
6c70: 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  ase.** when the 
6c80: 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f  "TEMP" or "TEMPO
6c90: 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63  RARY" keyword oc
6ca0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a  curs in between.
6cb0: 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41  ** CREATE and TA
6cc0: 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  BLE..**.** The n
6cd0: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  ew table record 
6ce0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  is initialized a
6cf0: 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65  nd put in pParse
6d00: 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20  ->pNewTable..** 
6d10: 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43  As more of the C
6d20: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6d30: 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c  ement is parsed,
6d40: 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69   additional acti
6d50: 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77  on.** routines w
6d60: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ill be called to
6d70: 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   add more inform
6d80: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65  ation to this re
6d90: 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20  cord..** At the 
6da0: 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
6db0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
6dc0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e  t, the sqlite3En
6dd0: 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65  dTable() routine
6de0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  .** is called to
6df0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f   complete the co
6e00: 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68  nstruction of th
6e10: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6e20: 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rd..*/.void sqli
6e30: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20  te3StartTable(. 
6e40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6e50: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
6e60: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6e70: 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72  pName1,   /* Fir
6e80: 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  st part of the n
6e90: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6ea0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f   or view */.  To
6eb0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f  ken *pName2,   /
6ec0: 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
6ed0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6ee0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6ef0: 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
6f00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6f10: 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74  this is a TEMP t
6f20: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
6f30: 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72  View,      /* Tr
6f40: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6f50: 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73  VIEW */.  int is
6f60: 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72  Virtual,   /* Tr
6f70: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6f80: 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f  VIRTUAL table */
6f90: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
6fa0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
6fb0: 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61  g if table alrea
6fc0: 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a  dy exists */.){.
6fd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b    Table *pTable;
6fe0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
6ff0: 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20   0; /* The name 
7000: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
7010: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
7020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7030: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
7040: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a   iDb;         /*
7050: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
7060: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
7070: 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b  able in */.  Tok
7080: 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a  en *pName;    /*
7090: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
70a0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
70b0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69  o create */..  i
70c0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
70d0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77   && db->init.new
70e0: 54 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  Tnum==1 ){.    /
70f0: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
7100: 20 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c   Parsing the sql
7110: 69 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71  ite_master or sq
7120: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
7130: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69   schema */.    i
7140: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
7150: 62 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  b;.    zName = s
7160: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
7170: 62 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  b, SCHEMA_TABLE(
7180: 69 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65  iDb));.    pName
7190: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c   = pName1;.  }el
71a0: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  se{.    /* The c
71b0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
71c0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
71d0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
71e0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
71f0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
7200: 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
7210: 72 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  rn;.    if( !OMI
7220: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7230: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
7240: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
7250: 20 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74       /* If creat
7260: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
7270: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
7280: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e  ot be qualified.
7290: 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a   Unless .      *
72a0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  * the database n
72b0: 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e  ame is "temp" an
72c0: 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  yway.  */.      
72d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
72e0: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
72f0: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
7300: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
7310: 64 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d");.      retur
7320: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
7330: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
7340: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
7350: 31 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  1;.    zName = s
7360: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
7370: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
7380: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
7390: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
73a0: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
73b0: 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
73c0: 28 76 6f 69 64 2a 29 7a 4e 61 6d 65 2c 20 70 4e  (void*)zName, pN
73d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
73e0: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
73f0: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
7400: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
7410: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51  return;.  if( SQ
7420: 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
7430: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
7440: 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29  pParse, zName) )
7450: 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e  {.    goto begin
7460: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7470: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  }.  if( db->init
7480: 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70  .iDb==1 ) isTemp
7490: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
74a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
74b0: 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74  IZATION.  assert
74c0: 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69  ( isTemp==0 || i
74d0: 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73  sTemp==1 );.  as
74e0: 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20  sert( isView==0 
74f0: 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a  || isView==1 );.
7500: 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63    {.    static c
7510: 6f 6e 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20  onst u8 aCode[] 
7520: 3d 20 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54  = {.       SQLIT
7530: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a  E_CREATE_TABLE,.
7540: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52         SQLITE_CR
7550: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c  EATE_TEMP_TABLE,
7560: 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  .       SQLITE_C
7570: 52 45 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20  REATE_VIEW,.    
7580: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
7590: 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d  _TEMP_VIEW.    }
75a0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
75b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
75c0: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
75d0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
75e0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
75f0: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
7600: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
7610: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
7620: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7630: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7640: 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c    if( !isVirtual
7650: 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43   && sqlite3AuthC
7660: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28 69 6e  heck(pParse, (in
7670: 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70 2b 32  t)aCode[isTemp+2
7680: 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20 20 20  *isView],.      
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
76c0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
76d0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
76e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
76f0: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
7700: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
7710: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
7720: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
7730: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
7740: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
7750: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
7760: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
7770: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
7780: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54  .  ** it does. T
7790: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
77a0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
77b0: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61   being parsed wa
77c0: 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f  s passed.  ** to
77d0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c   an sqlite3_decl
77e0: 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e  are_vtab() call.
77f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   In that case on
7800: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
7810: 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70  mes.  ** and typ
7820: 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  es will be used,
7830: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
7840: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
7850: 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20   namespace.  ** 
7860: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f  collisions..  */
7870: 0a 20 20 69 66 28 20 21 49 4e 5f 53 50 45 43 49  .  if( !IN_SPECI
7880: 41 4c 5f 50 41 52 53 45 20 29 7b 0a 20 20 20 20  AL_PARSE ){.    
7890: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
78a0: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
78b0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
78c0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
78d0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
78e0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
78f0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7900: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
7910: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
7920: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
7930: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
7940: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
7950: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
7960: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7970: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
7980: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
7990: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
79a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
79b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
79c0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f  >init.busy || CO
79d0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
79e0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
79f0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
7a00: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
7a10: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
7a20: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7a30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
7a40: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
7a50: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b, zName, zDb)!=
7a60: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
7a70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a80: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
7a90: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
7aa0: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
7ab0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7ac0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7ad0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
7ae0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
7af0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7b00: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
7b10: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
7b20: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
7b30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7b40: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
7b50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
7b60: 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  PT;.    pParse->
7b70: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
7b80: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7b90: 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  or;.  }.  pTable
7ba0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
7bb0: 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  .  pTable->iPKey
7bc0: 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d   = -1;.  pTable-
7bd0: 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
7be0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
7bf0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52  .  pTable->nTabR
7c00: 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53  ef = 1;.#ifdef S
7c10: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f  QLITE_DEFAULT_RO
7c20: 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  WEST.  pTable->n
7c30: 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71 6c 69  RowLogEst = sqli
7c40: 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49 54 45  te3LogEst(SQLITE
7c50: 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 29  _DEFAULT_ROWEST)
7c60: 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62 6c 65  ;.#else.  pTable
7c70: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
7c80: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
7c90: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
7ca0: 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e 64 69  048576) );.#endi
7cb0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  f.  assert( pPar
7cc0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
7cd0: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e   );.  pParse->pN
7ce0: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
7cf0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
7d00: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
7d10: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
7d20: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
7d30: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
7d40: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
7d50: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
7d60: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
7d70: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
7d80: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
7d90: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
7da0: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
7db0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
7dc0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
7dd0: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
7de0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
7df0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
7e00: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
7e10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
7e20: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
7e30: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
7e40: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54  Db, 0) );.    pT
7e50: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70  able->pSchema->p
7e60: 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b  SeqTab = pTable;
7e70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
7e80: 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
7e90: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
7ea0: 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65   will insert the
7eb0: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e   table record in
7ec0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  to.  ** the SQLI
7ed0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
7ee0: 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63    Note in partic
7ef0: 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73  ular that we mus
7f00: 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20  t go ahead.  ** 
7f10: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  and allocate the
7f20: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7f30: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  or the table ent
7f40: 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20  ry now.  Before 
7f50: 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59  any.  ** PRIMARY
7f60: 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b   KEY or UNIQUE k
7f70: 65 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73  eywords are pars
7f80: 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f  ed.  Those keywo
7f90: 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20  rds will cause. 
7fa0: 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62   ** indices to b
7fb0: 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68  e created and th
7fc0: 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d  e table record m
7fd0: 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20  ust come before 
7fe0: 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65  the .  ** indice
7ff0: 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72  s.  Hence, the r
8000: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
8010: 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20   the table must 
8020: 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a  be allocated.  *
8030: 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  * now..  */.  if
8040: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
8050: 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33   && (v = sqlite3
8060: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29  GetVdbe(pParse))
8070: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  !=0 ){.    int a
8080: 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69  ddr1;.    int fi
8090: 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e  leFormat;.    in
80a0: 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65  t reg1, reg2, re
80b0: 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52  g3;.    /* nullR
80c0: 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65  ow[] is an OP_Re
80d0: 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66  cord encoding of
80e0: 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e   a row containin
80f0: 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20  g 5 NULLs */.   
8100: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
8110: 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b  ar nullRow[] = {
8120: 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   6, 0, 0, 0, 0, 
8130: 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 };.    sqlite3
8140: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
8150: 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
8160: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
8170: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8180: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
8190: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
81a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
81b0: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
81c0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
81d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
81e0: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
81f0: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
8200: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
8210: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
8220: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
8230: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
8240: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
8250: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
8260: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
8270: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
8280: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8290: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
82a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
82b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
82c0: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
82d0: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
82e0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
82f0: 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  AT);.    sqlite3
8300: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
8310: 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31   iDb);.    addr1
8320: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
8330: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
8340: 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eg3); VdbeCovera
8350: 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46  ge(v);.    fileF
8360: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
8370: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
8380: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
83b0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
83c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
83d0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
83e0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
83f0: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66 69 6c  FILE_FORMAT, fil
8400: 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  eFormat);.    sq
8410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8420: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
8430: 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54   iDb, BTREE_TEXT
8440: 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43 28 64  _ENCODING, ENC(d
8450: 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b));.    sqlite3
8460: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8470: 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  addr1);..    /* 
8480: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
8490: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
84a0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
84b0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
84c0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
84d0: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
84e0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
84f0: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
8500: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
8510: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
8520: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
8530: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
8540: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
8550: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
8560: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
8570: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
8580: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
8590: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
85a0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  d..    ** The ro
85b0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
85c0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
85d0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70  is left in reg p
85e0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
85f0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
8600: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e   and root page n
8610: 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65  umber values are
8620: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
8630: 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ode that.    ** 
8640: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
8650: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
8660: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
8670: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8680: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
8690: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
86a0: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
86b0: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
86c0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
86d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
86e0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
86f0: 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d   0, reg2);.    }
8700: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
8710: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
8720: 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20 20 20  addrCrTab =.    
8730: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8740: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65  AddOp3(v, OP_Cre
8750: 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c 20 72  ateBtree, iDb, r
8760: 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54 4b 45  eg2, BTREE_INTKE
8770: 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Y);.    }.    sq
8780: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
8790: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
87a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
87b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
87c0: 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31  ewRowid, 0, reg1
87d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
87e0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
87f0: 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c  lob, 6, reg3, 0,
8800: 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41   nullRow, P4_STA
8810: 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
8820: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8830: 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67  P_Insert, 0, reg
8840: 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  3, reg1);.    sq
8850: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8860: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
8870: 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
8880: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
8890: 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  _Close);.  }..  
88a0: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
88b0: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
88c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
88d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
88e0: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
88f0: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
8900: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
8910: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
8920: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
8930: 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69  ./* Set properti
8940: 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f  es of a table co
8950: 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68  lumn based on th
8960: 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e  e (magical).** n
8970: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
8980: 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  n..*/.#if SQLITE
8990: 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43  _ENABLE_HIDDEN_C
89a0: 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69  OLUMNS.void sqli
89b0: 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
89c0: 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c  iesFromName(Tabl
89d0: 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20  e *pTab, Column 
89e0: 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71  *pCol){.  if( sq
89f0: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70  lite3_strnicmp(p
8a00: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68  Col->zName, "__h
8a10: 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30  idden__", 10)==0
8a20: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f   ){.    pCol->co
8a30: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
8a40: 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73  G_HIDDEN;.  }els
8a50: 65 20 69 66 28 20 70 54 61 62 20 26 26 20 70 43  e if( pTab && pC
8a60: 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26  ol!=pTab->aCol &
8a70: 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46  & (pCol[-1].colF
8a80: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48  lags & COLFLAG_H
8a90: 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54  IDDEN) ){.    pT
8aa0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
8ab0: 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20  TF_OOOHidden;.  
8ac0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8ad0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
8ae0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
8af0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
8b00: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
8b10: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
8b20: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
8b30: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
8b40: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
8b50: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
8b60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8b70: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
8b80: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
8b90: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
8ba0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
8bb0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
8bc0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
8bd0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
8be0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8bf0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
8c00: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8c10: 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e 20 2a   *pName, Token *
8c20: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
8c30: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
8c40: 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a  har *z;.  char *
8c50: 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20  zType;.  Column 
8c60: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
8c70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8c80: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
8c90: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
8ca0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8cb0: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
8cc0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8cd0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
8ce0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8cf0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8d00: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
8d10: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
8d20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8d30: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 44  }.  z = sqlite3D
8d40: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70  bMallocRaw(db, p
8d50: 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70 65 2d  Name->n + pType-
8d60: 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28 20 7a  >n + 2);.  if( z
8d70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8d80: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
8d90: 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33 52 65  JECT ) sqlite3Re
8da0: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
8db0: 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70  rse, (void*)z, p
8dc0: 4e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  Name);.  memcpy(
8dd0: 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  z, pName->z, pNa
8de0: 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e 61 6d  me->n);.  z[pNam
8df0: 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  e->n] = 0;.  sql
8e00: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
8e10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8e20: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8e30: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
8e40: 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69  cmp(z, p->aCol[i
8e50: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
8e60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8e70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
8e80: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
8e90: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
8ea0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8eb0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8ec0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8ed0: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
8ee0: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
8ef0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
8f00: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
8f10: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
8f20: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
8f30: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
8f40: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
8f50: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
8f60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f70: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8f80: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
8f90: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
8fa0: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
8fb0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
8fc0: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
8fd0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
8fe0: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
8ff0: 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74  ame = z;.  sqlit
9000: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
9010: 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43  esFromName(p, pC
9020: 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70 54 79  ol);. .  if( pTy
9030: 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  pe->n==0 ){.    
9040: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
9050: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
9060: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
9070: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
9080: 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c 4f 42  ity.    ** 'BLOB
9090: 27 20 77 69 74 68 20 61 20 64 65 66 61 75 6c 74  ' with a default
90a0: 20 73 69 7a 65 20 6f 66 20 34 20 62 79 74 65 73   size of 4 bytes
90b0: 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  . */.    pCol->a
90c0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
90d0: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
90e0: 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a  Col->szEst = 1;.
90f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9100: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
9110: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 34  RENCES.    if( 4
9120: 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  >=sqlite3GlobalC
9130: 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65  onfig.szSorterRe
9140: 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  f ){.      pCol-
9150: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
9160: 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 3b 0a  FLAG_SORTERREF;.
9170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
9180: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70 65 20  else{.    zType 
9190: 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53 74 72  = z + sqlite3Str
91a0: 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a 20 20  len30(z) + 1;.  
91b0: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
91c0: 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70 65 2d  pType->z, pType-
91d0: 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65 5b 70  >n);.    zType[p
91e0: 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  Type->n] = 0;.  
91f0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
9200: 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70 43 6f  (zType);.    pCo
9210: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
9220: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
9230: 65 28 7a 54 79 70 65 2c 20 70 43 6f 6c 29 3b 0a  e(zType, pCol);.
9240: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9250: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41  gs |= COLFLAG_HA
9260: 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70 2d 3e  STYPE;.  }.  p->
9270: 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73 65  nCol++;.  pParse
9280: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
9290: 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .n = 0;.}../*.**
92a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
92b0: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
92c0: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
92d0: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
92e0: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
92f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9300: 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  .  A "NOT NULL" 
9310: 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a  constraint has.*
9320: 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61  * been seen on a
9330: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72   column.  This r
9340: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
9350: 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a  notNull flag on.
9360: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75  ** the column cu
9370: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9380: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
9390: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f  oid sqlite3AddNo
93a0: 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  tNull(Parse *pPa
93b0: 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72  rse, int onError
93c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
93d0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
93e0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
93f0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
9400: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
9410: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
9420: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
9430: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  ol[p->nCol-1];. 
9440: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20 3d   pCol->notNull =
9450: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20   (u8)onError;.  
9460: 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
9470: 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a 20  F_HasNotNull;.. 
9480: 20 2f 2a 20 53 65 74 20 74 68 65 20 75 6e 69 71   /* Set the uniq
9490: 4e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 20  NotNull flag on 
94a0: 61 6e 79 20 55 4e 49 51 55 45 20 6f 72 20 50 4b  any UNIQUE or PK
94b0: 20 69 6e 64 65 78 65 73 20 61 6c 72 65 61 64 79   indexes already
94c0: 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f 6e   created.  ** on
94d0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20 2a   this column.  *
94e0: 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f  /.  if( pCol->co
94f0: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
9500: 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 49  _UNIQUE ){.    I
9510: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
9520: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
9530: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
9540: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
9550: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
9560: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 70  >nKeyCol==1 && p
9570: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
9580: 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 69  _None );.      i
9590: 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
95a0: 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31 20  n[0]==p->nCol-1 
95b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
95c0: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31  >uniqNotNull = 1
95d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
95e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61    }.}../*.** Sca
95f0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
9600: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
9610: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
9620: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
9630: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
9640: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
9650: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
9660: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
9670: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
9680: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
9690: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
96a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
96b0: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
96c0: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
96d0: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
96e0: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
96f0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
9700: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
9710: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
9720: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
9730: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
9740: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
9750: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
9760: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
9770: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
9780: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
9790: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
97a0: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
97b0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
97c0: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
97d0: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
97e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97f0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
9800: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
9810: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
9820: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
9830: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9840: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
9850: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
9860: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
9870: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9880: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
9890: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
98a0: 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52 45  _AFF_BLOB.** 'RE
98b0: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
98c0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
98d0: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
98e0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
98f0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
9900: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
9910: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
9920: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
9930: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
9940: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
9950: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
9960: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
9970: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
9980: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
99a0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a   Column *pCol){.
99b0: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
99c0: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
99d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
99e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61  const char *zCha
99f0: 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
9a00: 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77 68  ( zIn!=0 );.  wh
9a10: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
9a20: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
9a30: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
9a40: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
9a50: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
9a60: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
9a70: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
9a80: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
9a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
9aa0: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
9ab0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9ac0: 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20  ;.      zChar = 
9ad0: 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  zIn;.    }else i
9ae0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
9af0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9b00: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
9b10: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
9b20: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9b30: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
9b40: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
9b50: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9b60: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
9b70: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
9b80: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9b90: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9ba0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9bb0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
9bc0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
9bd0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
9be0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
9bf0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
9c00: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
9c10: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
9c20: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
9c30: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
9c40: 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  OB;.      if( zI
9c50: 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61  n[0]=='(' ) zCha
9c60: 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66  r = zIn;.#ifndef
9c70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
9c80: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
9c90: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9ca0: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
9cb0: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
9cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
9cd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9ce0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
9cf0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
9d00: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
9d10: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
9d20: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
9d30: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
9d40: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
9d50: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
9d60: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9d70: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9d80: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9d90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9da0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9db0: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
9dc0: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
9dd0: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9de0: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
9df0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
9e00: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9e10: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9e20: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
9e30: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
9e40: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
9e50: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
9e60: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9e70: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
9e80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9e90: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
9ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9eb0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c 20  }..  /* If pCol 
9ec0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f  is not NULL, sto
9ed0: 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f  re an estimate o
9ee0: 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65  f the field size
9ef0: 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69  .  The.  ** esti
9f00: 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73  mate is scaled s
9f10: 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  o that the size 
9f20: 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73  of an integer is
9f30: 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43   1.  */.  if( pC
9f40: 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20  ol ){.    int v 
9f50: 3d 20 30 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c  = 0;   /* defaul
9f60: 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78  t size is approx
9f70: 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20   4 bytes */.    
9f80: 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41  if( aff<SQLITE_A
9f90: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9fa0: 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b      if( zChar ){
9fb0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
9fc0: 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20  zChar[0] ){.    
9fd0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9fe0: 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30  3Isdigit(zChar[0
9ff0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
a000: 20 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41    /* BLOB(k), VA
a010: 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b  RCHAR(k), CHAR(k
a020: 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a  ) -> r=(k/4+1) *
a030: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
a040: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43  lite3GetInt32(zC
a050: 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  har, &v);.      
a060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a080: 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20     zChar++;.    
a090: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
a0a0: 65 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 31  e{.        v = 1
a0b0: 36 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45  6;   /* BLOB, TE
a0c0: 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20  XT, CLOB -> r=5 
a0d0: 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65   (approx 20 byte
a0e0: 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s)*/.      }.   
a0f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a100: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
a110: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
a120: 28 20 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62  ( v>=sqlite3Glob
a130: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65  alConfig.szSorte
a140: 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43  rRef ){.      pC
a150: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
a160: 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45  COLFLAG_SORTERRE
a170: 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  F;.    }.#endif.
a180: 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b      v = v/4 + 1;
a190: 0a 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29  .    if( v>255 )
a1a0: 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 70 43   v = 255;.    pC
a1b0: 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a 20  ol->szEst = v;. 
a1c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
a1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
a1e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
a1f0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
a200: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
a210: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
a220: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
a230: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
a240: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
a250: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
a260: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
a270: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
a280: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
a290: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
a2a0: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
a2b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a2c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
a2d0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
a2e0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
a2f0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
a300: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a310: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
a320: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
a330: 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65 20  tValue(.  Parse 
a340: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
a350: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
a360: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
a370: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
a380: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
a390: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20  d expression of 
a3a0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
a3b0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
a3c0: 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20 20  r *zStart,      
a3d0: 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65 20  /* Start of the 
a3e0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74 65  default value te
a3f0: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
a400: 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20 20  ar *zEnd        
a410: 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61 63   /* First charac
a420: 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66 20  ter past end of 
a430: 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65 78  defaut value tex
a440: 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  t */.){.  Table 
a450: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
a460: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
a470: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a480: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
a490: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
a4a0: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
a4b0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
a4c0: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
a4d0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
a4e0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a4f0: 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69  n(pExpr, db->ini
a500: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
a510: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a520: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
a530: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
a540: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
a550: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
a560: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
a570: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a580: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
a590: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
a5a0: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
a5b0: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
a5c0: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
a5d0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
a5e0: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
a5f0: 65 6d 6f 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  emory..      */.
a600: 20 20 20 20 20 20 45 78 70 72 20 78 3b 0a 20 20        Expr x;.  
a610: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a620: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
a630: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 6d 65  pDflt);.      me
a640: 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65  mset(&x, 0, size
a650: 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 78 2e  of(x));.      x.
a660: 6f 70 20 3d 20 54 4b 5f 53 50 41 4e 3b 0a 20 20  op = TK_SPAN;.  
a670: 20 20 20 20 78 2e 75 2e 7a 54 6f 6b 65 6e 20 3d      x.u.zToken =
a680: 20 73 71 6c 69 74 65 33 44 62 53 70 61 6e 44 75   sqlite3DbSpanDu
a690: 70 28 64 62 2c 20 7a 53 74 61 72 74 2c 20 7a 45  p(db, zStart, zE
a6a0: 6e 64 29 3b 0a 20 20 20 20 20 20 78 2e 70 4c 65  nd);.      x.pLe
a6b0: 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ft = pExpr;.    
a6c0: 20 20 78 2e 66 6c 61 67 73 20 3d 20 45 50 5f 53    x.flags = EP_S
a6d0: 6b 69 70 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  kip;.      pCol-
a6e0: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
a6f0: 45 78 70 72 44 75 70 28 64 62 2c 20 26 78 2c 20  ExprDup(db, &x, 
a700: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
a710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a720: 46 72 65 65 28 64 62 2c 20 78 2e 75 2e 7a 54 6f  Free(db, x.u.zTo
a730: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ken);.    }.  }.
a740: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
a750: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
a760: 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55  lite3RenameExprU
a770: 6e 6d 61 70 28 70 50 61 72 73 65 2c 20 70 45 78  nmap(pParse, pEx
a780: 70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  pr);.  }.  sqlit
a790: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a7a0: 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pExpr);.}../*.*
a7b0: 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70  * Backwards Comp
a7c0: 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a  atibility Hack:.
a7d0: 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  ** .** Historica
a7e0: 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  l versions of SQ
a7f0: 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73 74  Lite accepted st
a800: 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20  rings as column 
a810: 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65  names in.** inde
a820: 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20  xes and PRIMARY 
a830: 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
a840: 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f  and in UNIQUE co
a850: 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d  nstraints.  Exam
a860: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43  ple:.**.**     C
a870: 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28  REATE TABLE xyz(
a880: 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52  a,b,c,d,e,PRIMAR
a890: 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55  Y KEY('a'),UNIQU
a8a0: 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54  E('b','c' COLLAT
a8b0: 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43  E trim).**     C
a8c0: 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63 20  REATE INDEX abc 
a8d0: 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44  ON xyz('c','d' D
a8e0: 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20  ESC,'e' COLLATE 
a8f0: 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a  nocase DESC);.**
a900: 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66  .** This is goof
a910: 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73 65  y.  But to prese
a920: 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f  rve backwards co
a930: 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20 63  mpatibility we c
a940: 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63  ontinue to.** ac
a950: 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20 72  cept it.  This r
a960: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
a970: 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72  necessary conver
a980: 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72  sion.  It conver
a990: 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  ts.** the expres
a9a0: 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74  sion given in it
a9b0: 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20  s argument from 
a9c0: 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f  a TK_STRING into
a9d0: 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74   a TK_ID.** if t
a9e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a9f0: 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e   just a TK_STRIN
aa00: 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  G with an option
aa10: 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  al COLLATE claus
aa20: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78  e..** If the epx
aa30: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68  ression is anyth
aa40: 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54  ing other than T
aa50: 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78  K_STRING, the ex
aa60: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75  pression is.** u
aa70: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61  nchanged..*/.sta
aa80: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
aa90: 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20  StringToId(Expr 
aaa0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  *p){.  if( p->op
aab0: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
aac0: 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44     p->op = TK_ID
aad0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
aae0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
aaf0: 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  && p->pLeft->op=
ab00: 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20  =TK_STRING ){.  
ab10: 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d    p->pLeft->op =
ab20: 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f   TK_ID;.  }.}../
ab30: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
ab40: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
ab50: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
ab60: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
ab70: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
ab80: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
ab90: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
aba0: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
abb0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
abc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
abd0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
abe0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
abf0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
ac00: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
ac10: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
ac20: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
ac30: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
ac40: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
ac50: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
ac60: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
ac70: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
ac80: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
ac90: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
aca0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
acb0: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
acc0: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
acd0: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
ace0: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
acf0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
ad00: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
ad10: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
ad20: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
ad30: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
ad40: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
ad50: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
ad60: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
ad70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
ad80: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
ad90: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
ada0: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
adb0: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
adc0: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
add0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
ade0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
adf0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
ae00: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
ae10: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
ae20: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
ae30: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
ae40: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ae50: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
ae60: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
ae70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ae80: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
ae90: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
aea0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
aeb0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
aec0: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
aed0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
aee0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
aef0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
af00: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
af10: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
af20: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
af30: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
af40: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
af50: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
af60: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
af70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
af80: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
af90: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
afa0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
afb0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
afc0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20   Column *pCol = 
afd0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
afe0: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
aff0: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
b000: 30 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  0 ) goto primary
b010: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
b020: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
b030: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
b040: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
b050: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b060: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
b070: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
b080: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
b090: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
b0a0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
b0b0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
b0c0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
b0d0: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
b0e0: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
b0f0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
b100: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
b110: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20  l - 1;.    pCol 
b120: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
b130: 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63  ol];.    pCol->c
b140: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
b150: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
b160: 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c  nTerm = 1;.  }el
b170: 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20  se{.    nTerm = 
b180: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
b190: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
b1a0: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rm; i++){.      
b1b0: 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20 73  Expr *pCExpr = s
b1c0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
b1d0: 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  llate(pList->a[i
b1e0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
b1f0: 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21 3d  assert( pCExpr!=
b200: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
b210: 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43 45  e3StringToId(pCE
b220: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
b230: 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  pCExpr->op==TK_I
b240: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  D ){.        con
b250: 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20  st char *zCName 
b260: 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = pCExpr->u.zTok
b270: 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  en;.        for(
b280: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
b290: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
b2a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
b2b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
b2c0: 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  CName, pTab->aCo
b2d0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
b2e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
b2f0: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
b300: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
b310: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
b320: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
b330: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20  _PRIMKEY;.      
b340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b350: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b360: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b370: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
b380: 3d 3d 31 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20  ==1.   && pCol. 
b390: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49    && sqlite3StrI
b3a0: 43 6d 70 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d  Cmp(sqlite3Colum
b3b0: 6e 54 79 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20  nType(pCol,""), 
b3c0: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
b3d0: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53   && sortOrder!=S
b3e0: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20  QLITE_SO_DESC.  
b3f0: 29 7b 0a 20 20 20 20 69 66 28 20 49 4e 5f 52 45  ){.    if( IN_RE
b400: 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
b410: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71  List ){.      sq
b420: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
b430: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70  Remap(pParse, &p
b440: 54 61 62 2d 3e 69 50 4b 65 79 2c 20 70 4c 69 73  Tab->iPKey, pLis
b450: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
b460: 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e      }.    pTab->
b470: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
b480: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
b490: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
b4a0: 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49     assert( autoI
b4b0: 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63  nc==0 || autoInc
b4c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==1 );.    pTab-
b4d0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74  >tabFlags |= aut
b4e0: 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72  oInc*TF_Autoincr
b4f0: 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70  ement;.    if( p
b500: 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69  List ) pParse->i
b510: 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  PkSortOrder = pL
b520: 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
b530: 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  der;.  }else if(
b540: 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e   autoInc ){.#ifn
b550: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b560: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
b570: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b580: 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49  g(pParse, "AUTOI
b590: 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79  NCREMENT is only
b5a0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22   allowed on an "
b5b0: 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52  .       "INTEGER
b5c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a   PRIMARY KEY");.
b5d0: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
b5e0: 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74      sqlite3Creat
b5f0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
b600: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f  , 0, 0, pList, o
b610: 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20  nError, 0,.     
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64        0, sortOrd
b640: 65 72 2c 20 30 2c 20 53 51 4c 49 54 45 5f 49 44  er, 0, SQLITE_ID
b650: 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
b660: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
b670: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
b680: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
b690: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
b6a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
b6b0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
b6c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
b6d0: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
b6e0: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
b6f0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
b700: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
b710: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b720: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
b730: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b740: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
b750: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
b760: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
b770: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
b780: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
b790: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b7a0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
b7b0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
b7c0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69  NewTable;.  sqli
b7d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b7e0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62  ->db;.  if( pTab
b7f0: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
b800: 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69  VTAB.   && !sqli
b810: 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
b820: 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69  ly(db->aDb[db->i
b830: 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20  nit.iDb].pBt).  
b840: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  ){.    pTab->pCh
b850: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
b860: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
b870: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
b880: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
b890: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
b8a0: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
b8b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b8c0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
b8d0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
b8e0: 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63  heck, &pParse->c
b8f0: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31  onstraintName, 1
b900: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
b910: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
b920: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b930: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
b940: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  heckExpr);.  }.}
b950: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b960: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
b970: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
b980: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74  ecently parsed t
b990: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74  able column.** t
b9a0: 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69  o the CollSeq gi
b9b0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
b9c0: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
b9d0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
b9e0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
b9f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
ba00: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
ba10: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
ba20: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
ba30: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
ba40: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73   sequence */.  s
ba50: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
ba60: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
ba70: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
ba80: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
ba90: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20  >nCol-1;.  db = 
baa0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43  pParse->db;.  zC
bab0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
bac0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
bad0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
bae0: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
baf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
bb00: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
bb10: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
bb20: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
bb30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bb40: 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  db, p->aCol[i].z
bb50: 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43  Coll);.    p->aC
bb60: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
bb70: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
bb80: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
bb90: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
bba0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
bbb0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
bbc0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
bbd0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
bbe0: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
bbf0: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
bc00: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
bc10: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
bc20: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
bc30: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
bc40: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
bc50: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
bc60: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
bc70: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
bc80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
bc90: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b  x->nKeyCol==1 );
bca0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
bcb0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
bcc0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
bcd0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
bce0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
bcf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bd00: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
bd10: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
bd20: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
bd30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
bd40: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
bd50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
bd60: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
bd70: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
bd80: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
bd90: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
bda0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
bdb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
bdc0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
bdd0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
bde0: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
bdf0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
be00: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
be10: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
be20: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
be30: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
be40: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
be50: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
be60: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
be70: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
be80: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
be90: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
bea0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
beb0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
bec0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
bed0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
bee0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
bef0: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
bf00: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
bf10: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
bf20: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
bf30: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
bf40: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
bf50: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
bf60: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
bf70: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
bf80: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
bf90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bfa0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
bfb0: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
bfc0: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
bfd0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
bfe0: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
bff0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
c000: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
c010: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
c020: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
c030: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
c040: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
c050: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
c060: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
c070: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
c080: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
c090: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
c0a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
c0b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c0c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c0d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c0e0: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
c0f0: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
c100: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
c110: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
c120: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
c130: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
c140: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
c150: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
c160: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
c170: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
c180: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
c190: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
c1a0: 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  etCollSeq(pParse
c1b0: 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  , enc, pColl, zN
c1c0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ame);.  }..  ret
c1d0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
c1e0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c1f0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
c200: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
c210: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
c220: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
c230: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
c240: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
c250: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
c260: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
c270: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
c280: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
c290: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
c2a0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
c2b0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
c2c0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
c2d0: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
c2e0: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
c2f0: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
c300: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
c310: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
c320: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
c330: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
c340: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
c350: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
c360: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
c370: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
c380: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
c390: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
c3a0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
c3b0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
c3c0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
c3d0: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
c3e0: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
c3f0: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
c400: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
c410: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
c420: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
c430: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
c440: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
c450: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
c460: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
c470: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
c480: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
c490: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
c4a0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a  safe enough..**.
c4b0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
c4c0: 4e 2d 4f 46 3a 20 52 2d 33 34 32 33 30 2d 35 36  N-OF: R-34230-56
c4d0: 30 34 39 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  049 SQLite autom
c4e0: 61 74 69 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65  atically increme
c4f0: 6e 74 73 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  nts.** the schem
c500: 61 2d 76 65 72 73 69 6f 6e 20 77 68 65 6e 65 76  a-version whenev
c510: 65 72 20 74 68 65 20 73 63 68 65 6d 61 20 63 68  er the schema ch
c520: 61 6e 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anges..*/.void s
c530: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
c540: 69 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ie(Parse *pParse
c550: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
c560: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c570: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
c580: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
c590: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
c5a0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
c5b0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
c5c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c5d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
c5e0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
c5f0: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
c600: 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  N, .            
c610: 20 20 20 20 20 20 20 28 69 6e 74 29 28 31 2b 28         (int)(1+(
c620: 75 6e 73 69 67 6e 65 64 29 64 62 2d 3e 61 44 62  unsigned)db->aDb
c630: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
c640: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a  chema_cookie));.
c650: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65  }../*.** Measure
c660: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
c670: 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64  haracters needed
c680: 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67   to output the g
c690: 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69  iven.** identifi
c6a0: 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  er.  The number 
c6b0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
c6c0: 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65  s any quotes use
c6d0: 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f  d.** but does no
c6e0: 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  t include the nu
c6f0: 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  ll terminator..*
c700: 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
c710: 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76  e is conservativ
c720: 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20  e.  It might be 
c730: 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74  larger that what
c740: 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65   is.** really ne
c750: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
c760: 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28  int identLength(
c770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
c780: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
c790: 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b  =0; *z; n++, z++
c7a0: 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  ){.    if( *z=='
c7b0: 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  "' ){ n++; }.  }
c7c0: 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b  .  return n + 2;
c7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
c7e0: 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  rst parameter is
c7f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
c800: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
c810: 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70  The second .** p
c820: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
c830: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
c840: 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ger that contain
c850: 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a  s the offset at.
c860: 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  ** which to writ
c870: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
c880: 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  t buffer. This f
c890: 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74  unction copies t
c8a0: 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  he.** nul-termin
c8b0: 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e  ated string poin
c8c0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68  ted to by the th
c8d0: 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a  ird parameter, z
c8e0: 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20  SignedIdent,.** 
c8f0: 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
c900: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62   offset in the b
c910: 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65  uffer and update
c920: 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72  s *pIdx to refer
c930: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
c940: 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
c950: 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65  last byte writte
c960: 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
c970: 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  ng..** .** If th
c980: 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64  e string zSigned
c990: 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65  Ident consists e
c9a0: 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61  ntirely of alpha
c9b0: 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72  -numeric.** char
c9c0: 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74  acters, does not
c9d0: 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69   begin with a di
c9e0: 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61  git and is not a
c9f0: 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a  n SQL keyword,.*
ca00: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  * then it is cop
ca10: 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
ca20: 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79  t buffer exactly
ca30: 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72   as it is. Other
ca40: 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71  wise,.** it is q
ca50: 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62  uoted using doub
ca60: 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74  le-quotes..*/.st
ca70: 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50  atic void identP
ca80: 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ut(char *z, int 
ca90: 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69  *pIdx, char *zSi
caa0: 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e  gnedIdent){.  un
cab0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64  signed char *zId
cac0: 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ent = (unsigned 
cad0: 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65  char*)zSignedIde
cae0: 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  nt;.  int i, j, 
caf0: 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d  needQuote;.  i =
cb00: 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a   *pIdx;..  for(j
cb10: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
cb20: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71  ++){.    if( !sq
cb30: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64  lite3Isalnum(zId
cb40: 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e  ent[j]) && zIden
cb50: 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61  t[j]!='_' ) brea
cb60: 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f  k;.  }.  needQuo
cb70: 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69  te = sqlite3Isdi
cb80: 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20  git(zIdent[0]). 
cb90: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
cba0: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
cbb0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
cbc0: 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ID.            |
cbd0: 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20  | zIdent[j]!=0. 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d             || j=
cbf0: 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51  =0;..  if( needQ
cc00: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
cc10: 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  '"';.  for(j=0; 
cc20: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
cc30: 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49  .    z[i++] = zI
cc40: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  dent[j];.    if(
cc50: 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20   zIdent[j]=='"' 
cc60: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
cc70: 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75    }.  if( needQu
cc80: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
cc90: 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a  "';.  z[i] = 0;.
cca0: 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a    *pIdx = i;.}..
ccb0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
ccc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
ccd0: 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69  atement appropri
cce0: 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
ccf0: 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d  n.** table.  Mem
cd00: 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ory to hold the 
cd10: 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74  text of the stat
cd20: 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65  ement is obtaine
cd30: 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  d.** from sqlite
cd40: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
cd50: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
cd60: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
cd70: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
cd80: 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53  ar *createTableS
cd90: 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  tmt(sqlite3 *db,
cda0: 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e   Table *p){.  in
cdb0: 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61  t i, k, n;.  cha
cdc0: 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72  r *zStmt;.  char
cdd0: 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20   *zSep, *zSep2, 
cde0: 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20  *zEnd;.  Column 
cdf0: 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a  *pCol;.  n = 0;.
ce00: 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e    for(pCol = p->
ce10: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
ce20: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
ce30: 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65  +){.    n += ide
ce40: 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a  ntLength(pCol->z
ce50: 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20  Name) + 5;.  }. 
ce60: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
ce70: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
ce80: 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20  f( n<50 ){ .    
ce90: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
cea0: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
ceb0: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
cec0: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
ced0: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
cee0: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
cef0: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
cf00: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
cf10: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
cf20: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
cf30: 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20  locRaw(0, n);.  
cf40: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
cf50: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
cf60: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
cf70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
cf80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c  ite3_snprintf(n,
cf90: 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20   zStmt, "CREATE 
cfa0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
cfb0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
cfc0: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
cfd0: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
cfe0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
cff0: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
d000: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
d010: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
d020: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
d030: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
d040: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54  char * const azT
d050: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ype[] = {.      
d060: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
d070: 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20  BLOB    */ "",. 
d080: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
d090: 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f 20  _AFF_TEXT    */ 
d0a0: 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20 20  " TEXT",.       
d0b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
d0c0: 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22  UMERIC */ " NUM"
d0d0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d0e0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
d0f0: 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20  */ " INT",.     
d100: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d110: 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45  _REAL    */ " RE
d120: 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  AL".    };.    i
d130: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  nt len;.    cons
d140: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a  t char *zType;..
d150: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
d160: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
d170: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
d180: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
d190: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
d1a0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
d1b0: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
d1c0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
d1d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73  >zName);.    ass
d1e0: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
d1f0: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ity-SQLITE_AFF_B
d200: 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  LOB >= 0 );.    
d210: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
d220: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
d230: 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79 53 69  F_BLOB < ArraySi
d240: 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20  ze(azType) );.  
d250: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d260: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d270: 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20  TE_AFF_BLOB );. 
d280: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
d290: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
d2a0: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a  ITE_AFF_TEXT );.
d2b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
d2c0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
d2d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
d2e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
d2f0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d300: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
d310: 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74  EGER );.    test
d320: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d330: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d340: 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20  _REAL );.    .  
d350: 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65    zType = azType
d360: 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20  [pCol->affinity 
d370: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  - SQLITE_AFF_BLO
d380: 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71  B];.    len = sq
d390: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
d3a0: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
d3b0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
d3c0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
d3d0: 42 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  B .            |
d3e0: 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  | pCol->affinity
d3f0: 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ==sqlite3Affinit
d400: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20  yType(zType, 0) 
d410: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
d420: 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20  Stmt[k], zType, 
d430: 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c  len);.    k += l
d440: 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
d450: 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71  k<=n );.  }.  sq
d460: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
d470: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
d480: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
d490: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
d4a0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49  *.** Resize an I
d4b0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68  ndex object to h
d4c0: 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f  old N columns to
d4d0: 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tal.  Return SQL
d4e0: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
d4f0: 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  cess and SQLITE_
d500: 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20  NOMEM on an OOM 
d510: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
d520: 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78   int resizeIndex
d530: 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
d540: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
d550: 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20   int N){.  char 
d560: 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e  *zExtra;.  int n
d570: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78  Byte;.  if( pIdx
d580: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72  ->nColumn>=N ) r
d590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
d5b0: 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b  >isResized==0 );
d5c0: 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65  .  nByte = (size
d5d0: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
d5e0: 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a  of(i16) + 1)*N;.
d5f0: 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74    zExtra = sqlit
d600: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
d610: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
d620: 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74   zExtra==0 ) ret
d630: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d640: 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28  _BKPT;.  memcpy(
d650: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a  zExtra, pIdx->az
d660: 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61  Coll, sizeof(cha
d670: 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r*)*pIdx->nColum
d680: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  n);.  pIdx->azCo
d690: 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ll = (const char
d6a0: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
d6b0: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
d6c0: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
d6d0: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d6e0: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
d6f0: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
d700: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
d710: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
d720: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
d730: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
d740: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d750: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
d760: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
d770: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
d780: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
d790: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
d7a0: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
d7b0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
d7c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d7d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
d7e0: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
d7f0: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
d800: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
d810: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
d820: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
d830: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
d840: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
d850: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
d860: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
d870: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
d880: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
d890: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
d8a0: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
d8b0: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
d8c0: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
d8d0: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
d8e0: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
d8f0: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
d900: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
d910: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
d920: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
d930: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
d940: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
d950: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
d960: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
d970: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
d980: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
d990: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
d9a0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
d9b0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
d9c0: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
d9d0: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
d9e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
d9f0: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
da00: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
da10: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
da20: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
da30: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
da40: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
da50: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
da60: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
da70: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
da80: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
da90: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
daa0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
dab0: 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66   if value x is f
dac0: 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20  ound any of the 
dad0: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
dae0: 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f  es of aiCol[].*/
daf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
db00: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
db10: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
db20: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
db30: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20  e( nCol-- > 0 ) 
db40: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
db50: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
db60: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
db70: 52 65 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  Recompute the co
db80: 6c 4e 6f 74 49 64 78 65 64 20 66 69 65 6c 64 20  lNotIdxed field 
db90: 6f 66 20 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a  of the Index..**
dba0: 0a 2a 2a 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20  .** colNotIdxed 
dbb0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
dbc0: 74 20 68 61 73 20 61 20 30 20 62 69 74 20 72 65  t has a 0 bit re
dbd0: 70 72 65 73 65 6e 74 69 6e 67 20 65 61 63 68 20  presenting each 
dbe0: 69 6e 64 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d  indexed.** colum
dbf0: 6e 73 20 74 68 61 74 20 61 72 65 20 77 69 74 68  ns that are with
dc00: 69 6e 20 74 68 65 20 66 69 72 73 74 20 36 33 20  in the first 63 
dc10: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74  columns of the t
dc20: 61 62 6c 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69  able.  The.** hi
dc30: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
dc40: 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 61  colNotIdxed is a
dc50: 6c 77 61 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e  lways 1.  All un
dc60: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a  indexed columns.
dc70: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
dc80: 68 61 76 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20  have a 1..**.** 
dc90: 54 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20  The colNotIdxed 
dca0: 6d 61 73 6b 20 69 73 20 41 4e 44 2d 65 64 20 77  mask is AND-ed w
dcb0: 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2e  ith the SrcList.
dcc0: 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b  a[].colUsed mask
dcd0: 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
dce0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   if the index is
dcf0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
dd00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dd10: 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73  recomputeColumns
dd20: 4e 6f 74 49 6e 64 65 78 65 64 28 49 6e 64 65 78  NotIndexed(Index
dd30: 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74 6d 61   *pIdx){.  Bitma
dd40: 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sk m = 0;.  int 
dd50: 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d  j;.  for(j=pIdx-
dd60: 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30  >nColumn-1; j>=0
dd70: 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; j--){.    int 
dd80: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
dd90: 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78  mn[j];.    if( x
dda0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
ddb0: 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20  tcase( x==BMS-1 
ddc0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ddd0: 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20  e( x==BMS-2 );. 
dde0: 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
ddf0: 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28   ) m |= MASKBIT(
de00: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  x);.    }.  }.  
de10: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65  pIdx->colNotIdxe
de20: 64 20 3d 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74  d = ~m;.  assert
de30: 28 20 28 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49  ( (pIdx->colNotI
de40: 64 78 65 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a  dxed>>63)==1 );.
de50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
de60: 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68  utine runs at th
de70: 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67  e end of parsing
de80: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
de90: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a  statement that.*
dea0: 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20  * has a WITHOUT 
deb0: 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54  ROWID clause.  T
dec0: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
ded0: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e  outine is to con
dee0: 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74  vert both.** int
def0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74  ernal schema dat
df00: 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64  a structures and
df10: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56   the generated V
df20: 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74  DBE code so that
df30: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70   they.** are app
df40: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57  ropriate for a W
df50: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
df60: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  le instead of a 
df70: 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20  rowid table..** 
df80: 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a  Changes include:
df90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
dfa0: 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  Set all columns 
dfb0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
dfc0: 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  EY schema object
dfd0: 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e   to be NOT NULL.
dfe0: 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 43 6f 6e  .**     (2)  Con
dff0: 76 65 72 74 20 50 33 20 70 61 72 61 6d 65 74 65  vert P3 paramete
e000: 72 20 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61  r of the OP_Crea
e010: 74 65 42 74 72 65 65 20 66 72 6f 6d 20 42 54 52  teBtree from BTR
e020: 45 45 5f 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20  EE_INTKEY .**   
e030: 20 20 20 20 20 20 20 69 6e 74 6f 20 42 54 52 45         into BTRE
e040: 45 5f 42 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20  E_BLOBKEY..**   
e050: 20 20 28 33 29 20 20 42 79 70 61 73 73 20 74 68    (3)  Bypass th
e060: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
e070: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e080: 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20  table entry.**  
e090: 20 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20          for the 
e0a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74  PRIMARY KEY as t
e0b0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
e0c0: 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20  ndex is now.**  
e0d0: 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
e0e0: 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
e0f0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
e100: 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
e110: 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20   itself..**     
e120: 28 34 29 20 20 53 65 74 20 74 68 65 20 49 6e 64  (4)  Set the Ind
e130: 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50  ex.tnum of the P
e140: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
e150: 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
e160: 2a 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d  *          schem
e170: 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67  a to the rootpag
e180: 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  e from the main 
e190: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35  table..**     (5
e1a0: 29 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  )  Add all table
e1b0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
e1c0: 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65  PRIMARY KEY Inde
e1d0: 78 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20  x object.**     
e1e0: 20 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65       so that the
e1f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
e200: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
e210: 2e 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a  .  The surplus.*
e220: 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  *          colum
e230: 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b  ns are part of K
e240: 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64  eyInfo.nAllField
e250: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 73 65   and are not use
e260: 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  d for.**        
e270: 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f    sorting or loo
e280: 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e 65 73  kup or uniquenes
e290: 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20  s checks..**    
e2a0: 20 28 36 29 20 20 52 65 70 6c 61 63 65 20 74 68   (6)  Replace th
e2b0: 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20  e rowid tail on 
e2c0: 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  all automaticall
e2d0: 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e 49 51  y generated UNIQ
e2e0: 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  UE.**          i
e2f0: 6e 64 69 63 65 73 20 77 69 74 68 20 74 68 65 20  ndices with the 
e300: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
e310: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76  mns..**.** For v
e320: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f  irtual tables, o
e330: 6e 6c 79 20 28 31 29 20 69 73 20 70 65 72 66 6f  nly (1) is perfo
e340: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
e350: 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57 69  void convertToWi
e360: 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
e370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
e380: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
e390: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e  ndex *pIdx;.  In
e3a0: 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20  dex *pPk;.  int 
e3b0: 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  nPk;.  int i, j;
e3c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e3d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
e3e0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e3f0: 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61  >pVdbe;..  /* Ma
e400: 72 6b 20 65 76 65 72 79 20 50 52 49 4d 41 52 59  rk every PRIMARY
e410: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e   KEY column as N
e420: 4f 54 20 4e 55 4c 4c 20 28 65 78 63 65 70 74 20  OT NULL (except 
e430: 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61 62  for imposter tab
e440: 6c 65 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les).  */.  if( 
e450: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
e460: 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  erTable ){.    f
e470: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
e480: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
e490: 20 20 69 66 28 20 28 70 54 61 62 2d 3e 61 43 6f    if( (pTab->aCo
e4a0: 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
e4b0: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29  COLFLAG_PRIMKEY)
e4c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
e4d0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74  Tab->aCol[i].not
e4e0: 4e 75 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  Null = OE_Abort;
e4f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e500: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74   }..  /* Convert
e510: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
e520: 6f 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65  of the OP_Create
e530: 42 74 72 65 65 20 6f 70 63 6f 64 65 20 66 72 6f  Btree opcode fro
e540: 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 0a 20  m BTREE_INTKEY. 
e550: 20 2a 2a 20 69 6e 74 6f 20 42 54 52 45 45 5f 42   ** into BTREE_B
e560: 4c 4f 42 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 69  LOBKEY..  */.  i
e570: 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  f( pParse->addrC
e580: 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  rTab ){.    asse
e590: 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c  rt( v );.    sql
e5a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
e5b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
e5c0: 43 72 54 61 62 2c 20 42 54 52 45 45 5f 42 4c 4f  CrTab, BTREE_BLO
e5d0: 42 4b 45 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  BKEY);.  }..  /*
e5e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49 4d   Locate the PRIM
e5f0: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 20  ARY KEY index.  
e600: 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62 6c  Or, if this tabl
e610: 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  e was originally
e620: 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45 52  .  ** an INTEGER
e630: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61 62   PRIMARY KEY tab
e640: 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  le, create a new
e650: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
e660: 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex. .  */.  if( 
e670: 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
e680: 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  {.    ExprList *
e690: 70 4c 69 73 74 3b 0a 20 20 20 20 54 6f 6b 65 6e  pList;.    Token
e6a0: 20 69 70 6b 54 6f 6b 65 6e 3b 0a 20 20 20 20 73   ipkToken;.    s
e6b0: 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28  qlite3TokenInit(
e6c0: 26 69 70 6b 54 6f 6b 65 6e 2c 20 70 54 61 62 2d  &ipkToken, pTab-
e6d0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
e6e0: 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  y].zName);.    p
e6f0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
e700: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
e710: 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rse, 0, .       
e720: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e730: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
e740: 54 4b 5f 49 44 2c 20 26 69 70 6b 54 6f 6b 65 6e  TK_ID, &ipkToken
e750: 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 0));.    if( p
e760: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
e770: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
e780: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50  ].sortOrder = pP
e790: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
e7a0: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
e7b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
e7c0: 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 73  e==pTab );.    s
e7d0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
e7e0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
e7f0: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
e800: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
e810: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
e820: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e830: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
e840: 52 59 4b 45 59 29 3b 0a 20 20 20 20 69 66 28 20  RYKEY);.    if( 
e850: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e860: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
e870: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e880: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
e890: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
e8a0: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
e8b0: 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  ey = -1;.  }else
e8c0: 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  {.    pPk = sqli
e8d0: 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
e8e0: 65 78 28 70 54 61 62 29 3b 0a 0a 20 20 20 20 2f  ex(pTab);..    /
e8f0: 2a 0a 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20  *.    ** Remove 
e900: 61 6c 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f  all redundant co
e910: 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50  lumns from the P
e920: 52 49 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72  RIMARY KEY.  For
e930: 20 65 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65   example, change
e940: 0a 20 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59  .    ** "PRIMARY
e950: 20 4b 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62   KEY(a,b,a,b,c,b
e960: 2c 63 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74  ,c,d)" into just
e970: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
e980: 62 2c 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a  b,c,d)".  Later.
e990: 20 20 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75      ** code assu
e9a0: 6d 65 73 20 74 68 65 20 50 52 49 4d 41 52 59 20  mes the PRIMARY 
e9b0: 4b 45 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  KEY contains no 
e9c0: 72 65 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73  repeated columns
e9d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
e9e0: 28 69 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e  (i=j=1; i<pPk->n
e9f0: 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
ea00: 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
ea10: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
ea20: 20 6a 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d   j, pPk->aiColum
ea30: 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n[i]) ){.       
ea40: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b   pPk->nColumn--;
ea50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ea60: 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
ea70: 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
ea80: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
ea90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
eaa0: 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
eab0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
eac0: 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
ead0: 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
eae0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
eaf0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
eb00: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
eb10: 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
eb20: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
eb30: 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65  * Bypass the cre
eb40: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49  ation of the PRI
eb50: 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61  MARY KEY btree a
eb60: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  nd the sqlite_ma
eb70: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
eb80: 65 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f  entry. This is o
eb90: 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20  nly required if 
eba0: 63 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61  currently genera
ebb0: 74 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63  ting VDBE.  ** c
ebc0: 6f 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45  ode for a CREATE
ebd0: 20 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e   TABLE (not when
ebe0: 20 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20   parsing one as 
ebf0: 70 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a  part of reading.
ec00: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
ec10: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69  schema).  */.  i
ec20: 66 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75  f( v && pPk->tnu
ec30: 6d 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  m>0 ){.    asser
ec40: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  t( db->init.busy
ec50: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
ec60: 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
ec70: 64 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c  de(v, pPk->tnum,
ec80: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a   OP_Goto);.  }..
ec90: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
eca0: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
ecb0: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
ecc0: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
ecd0: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
ece0: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
ecf0: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
ed00: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
ed10: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
ed20: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
ed30: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
ed40: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
ed50: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
ed60: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
ed70: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
ed80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
ed90: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
eda0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
edb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
edc0: 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69  n;.    if( IsPri
edd0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
ede0: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
edf0: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
ee00: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
ee10: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
ee20: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
ee30: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
ee40: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
ee50: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
ee60: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
ee70: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65      /* This inde
ee80: 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74 20  x is a superset 
ee90: 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  of the primary k
eea0: 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78  ey */.      pIdx
eeb0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78  ->nColumn = pIdx
eec0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
eed0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
eee0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
eef0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
ef00: 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43  Idx, pIdx->nKeyC
ef10: 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol+n) ) return;.
ef20: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70      for(i=0, j=p
ef30: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c  Idx->nKeyCol; i<
ef40: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
ef50: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
ef60: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
ef70: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
ef80: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
ef90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
efa0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20  ->aiColumn[j] = 
efb0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
efc0: 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  ;.        pIdx->
efd0: 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d  azColl[j] = pPk-
efe0: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
eff0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d      j++;.      }
f000: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
f010: 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  t( pIdx->nColumn
f020: 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  >=pIdx->nKeyCol+
f030: 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  n );.    assert(
f040: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
f050: 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  j );.  }..  /* A
f060: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
f070: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
f080: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
f090: 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54 61  */.  if( nPk<pTa
f0a0: 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69  b->nCol ){.    i
f0b0: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
f0c0: 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70 54  ject(db, pPk, pT
f0d0: 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75  ab->nCol) ) retu
f0e0: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
f0f0: 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e   j=nPk; i<pTab->
f100: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
f110: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
f120: 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  (pPk->aiColumn, 
f130: 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20 20  j, i) ){.       
f140: 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e   assert( j<pPk->
f150: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
f160: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
f170: 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  [j] = i;.       
f180: 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20   pPk->azColl[j] 
f190: 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
f1a0: 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  RY;.        j++;
f1b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f1c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
f1d0: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
f1e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
f1f0: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
f200: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
f210: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
f220: 6c 3b 0a 20 20 7d 0a 20 20 72 65 63 6f 6d 70 75  l;.  }.  recompu
f230: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
f240: 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a 23 69 66  xed(pPk);.}..#if
f250: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f260: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
f270: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
f280: 69 66 20 7a 4e 61 6d 65 20 69 73 20 61 20 73 68  if zName is a sh
f290: 61 64 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65 20  adow table name 
f2a0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
f2b0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
f2c0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61  ction..**.** zNa
f2d0: 6d 65 20 69 73 20 74 65 6d 70 6f 72 61 72 69 6c  me is temporaril
f2e0: 79 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  y modified while
f2f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f300: 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74 20 69 73   running, but is
f310: 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20 74 6f 20  .** restored to 
f320: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  its original val
f330: 75 65 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ue prior to this
f340: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 69   routine returni
f350: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
f360: 74 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  t isShadowTableN
f370: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
f380: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
f390: 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b 20 20 20   char *zTail;   
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
f3c0: 20 6c 61 73 74 20 22 5f 22 20 69 6e 20 7a 4e 61   last "_" in zNa
f3d0: 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
f3e0: 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
f3f0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
f400: 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 73  hat zName is a s
f410: 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20 20 4d 6f  hadow of */.  Mo
f420: 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20 20 20 20  dule *pMod;     
f430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
f440: 6f 64 75 6c 65 20 66 6f 72 20 74 68 65 20 76 69  odule for the vi
f450: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 0a  rtual table */..
f460: 20 20 7a 54 61 69 6c 20 3d 20 73 74 72 72 63 68    zTail = strrch
f470: 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29 3b 0a 20  r(zName, '_');. 
f480: 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30 20 29 20   if( zTail==0 ) 
f490: 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a 7a 54 61  return 0;.  *zTa
f4a0: 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 20 3d  il = 0;.  pTab =
f4b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
f4c0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  e(db, zName, 0);
f4d0: 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27 5f 27 3b  .  *zTail = '_';
f4e0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
f4f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f500: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
f510: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
f520: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29  pMod = (Module*)
f530: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
f540: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 70 54  &db->aModule, pT
f550: 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b  ab->azModuleArg[
f560: 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d 6f 64 3d  0]);.  if( pMod=
f570: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f580: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75   if( pMod->pModu
f590: 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c 33 20 29  le->iVersion<3 )
f5a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
f5b0: 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e   pMod->pModule->
f5c0: 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d 30 20 29  xShadowName==0 )
f5d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
f5e0: 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  urn pMod->pModul
f5f0: 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 28 7a  e->xShadowName(z
f600: 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65 6c 73 65  Tail+1);.}.#else
f610: 0a 23 20 64 65 66 69 6e 65 20 69 73 53 68 61 64  .# define isShad
f620: 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78 2c 79 29  owTableName(x,y)
f630: 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e   0.#endif /* ifn
f640: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f650: 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
f660: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f670: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
f680: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
f690: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
f6a0: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
f6b0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
f6c0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
f6d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
f6e0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
f6f0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
f700: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
f710: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
f720: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
f730: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
f740: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
f750: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
f760: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
f770: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
f780: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
f790: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
f7a0: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
f7b0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
f7c0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
f7d0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
f7e0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
f7f0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
f800: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
f810: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
f820: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
f830: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
f840: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
f850: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
f860: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
f870: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
f880: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
f890: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
f8a0: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
f8b0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
f8c0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
f8d0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
f8e0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
f8f0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
f900: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
f910: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
f920: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
f930: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
f940: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
f950: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
f960: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
f970: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
f980: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
f990: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
f9a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
f9b0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
f9c0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
f9d0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
f9e0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
f9f0: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
fa00: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
fa10: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
fa20: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
fa30: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
fa40: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
fa50: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
fa60: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
fa70: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
fa80: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
fa90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27        /* The ')'
faa0: 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20   before options 
fab0: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
fac0: 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f  BLE */.  u8 tabO
fad0: 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  pts,            
fae0: 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20   /* Extra table 
faf0: 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79  options. Usually
fb00: 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   0. */.  Select 
fb10: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
fb20: 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
fb30: 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
fb40: 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
fb50: 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20   Table *p;      
fb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fb70: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
fb80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
fb90: 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
fba0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
fbb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
fbc0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
fbd0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
fbe0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61   in which the ta
fbf0: 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49  ble lives */.  I
fc00: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
fc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
fc20: 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20  mplied index of 
fc30: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
fc40: 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70  if( pEnd==0 && p
fc50: 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
fc60: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
fc70: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
fc80: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20  ocFailed );.  p 
fc90: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
fca0: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
fcb0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
fcc0: 20 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 69   pSelect==0 && i
fcd0: 73 53 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65  sShadowTableName
fce0: 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 20 29  (db, p->zName) )
fcf0: 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67  {.    p->tabFlag
fd00: 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f 77 3b 0a  s |= TF_Shadow;.
fd10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
fd20: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
fd30: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
fd40: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
fd50: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
fd60: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
fd70: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
fd80: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
fd90: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
fda0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
fdb0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
fdc0: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
fdd0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
fde0: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
fdf0: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
fe00: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
fe10: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
fe20: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
fe30: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
fe40: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
fe50: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
fe60: 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine.).  **.  ** 
fe70: 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  If the root page
fe80: 20 6e 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68   number is 1, th
fe90: 61 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73  at means this is
fea0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
feb0: 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74  er.  ** table it
fec0: 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69  self.  So mark i
fed0: 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a  t read-only..  *
fee0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
fef0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28  .busy ){.    if(
ff00: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
ff10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ff20: 67 28 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20  g(pParse, "");. 
ff30: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
ff40: 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d   }.    p->tnum =
ff50: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ff60: 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e  m;.    if( p->tn
ff70: 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c  um==1 ) p->tabFl
ff80: 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e  ags |= TF_Readon
ff90: 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  ly;.  }..  /* Sp
ffa0: 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
ffb0: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
ffc0: 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
ffd0: 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
ffe0: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
fff0: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
10000 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
10010 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
10020 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10030 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10040 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
10050 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
10060 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
10070 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
10080 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
10090 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
100a0 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
100b0 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
100c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
100d0 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
100e0 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
100f0 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
10100 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
10110 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
10120 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
10130 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f  outRowid | TF_No
10140 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
10150 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74      convertToWit
10160 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70  houtRowidTable(p
10170 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
10180 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71  .  }..  iDb = sq
10190 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
101a0 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
101b0 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
101c0 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
101d0 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
101e0 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63  s in all CHECK c
101f0 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73  onstraint expres
10200 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
10210 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ( p->pCheck ){. 
10220 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
10230 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
10240 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43  Parse, p, NC_IsC
10250 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65  heck, 0, p->pChe
10260 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  ck);.  }.#endif 
10270 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10280 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a  TE_OMIT_CHECK) *
10290 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  /..  /* Estimate
102a0 20 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77   the average row
102b0 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61   size for the ta
102c0 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20  ble and for all 
102d0 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20  implied indices 
102e0 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62  */.  estimateTab
102f0 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f  leWidth(p);.  fo
10300 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
10310 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10320 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65  x->pNext){.    e
10330 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
10340 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20  h(pIdx);.  }..  
10350 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
10360 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
10370 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
10380 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
10390 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
103a0 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
103b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
103c0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
103d0 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
103e0 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
103f0 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
10400 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
10410 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
10420 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
10430 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
10440 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
10450 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
10460 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
10470 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
10480 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
10490 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
104a0 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
104b0 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
104c0 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
104d0 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
104e0 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
104f0 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
10500 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
10510 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
10520 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10530 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e  arse);.    if( N
10540 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74  EVER(v==0) ) ret
10550 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  urn;..    sqlite
10560 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10570 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20  P_Close, 0);..  
10580 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69    /* .    ** Ini
10590 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f  tialize zType fo
105a0 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f  r the new view o
105b0 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  r table..    */.
105c0 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65      if( p->pSele
105d0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ct==0 ){.      /
105e0 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
105f0 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  e */.      zType
10600 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20   = "table";.    
10610 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c    zType2 = "TABL
10620 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  E";.#ifndef SQLI
10630 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20  TE_OMIT_VIEW.   
10640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
10650 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   A view */.     
10660 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b   zType = "view";
10670 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20  .      zType2 = 
10680 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20  "VIEW";.#endif. 
10690 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
106a0 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45  this is a CREATE
106b0 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c   TABLE xx AS SEL
106c0 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65  ECT ..., execute
106d0 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
106e0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  ** statement to 
106f0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77  populate the new
10700 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74   table. The root
10710 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72  -page number for
10720 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20   the.    ** new 
10730 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69  table is in regi
10740 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
10750 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  Root..    **.   
10760 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
10770 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
10780 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
10790 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
107a0 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
107b0 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
107c0 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
107d0 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
107e0 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
107f0 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
10800 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
10810 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
10820 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
10830 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
10840 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
10850 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
10860 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
10870 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
10880 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
10890 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
108a0 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
108b0 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
108c0 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
108d0 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
108e0 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
108f0 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
10900 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
10910 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
10920 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
10930 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72  dest;    /* Wher
10940 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f  e the SELECT sho
10950 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74  uld store result
10960 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
10970 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f  egYield;       /
10980 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
10990 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e  ng co-routine en
109a0 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  try-point */.   
109b0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20     int addrTop; 
109c0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
109d0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
109e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
109f0 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
10a00 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69  A record to be i
10a10 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e  nsert into the n
10a20 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ew table */.    
10a30 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20    int regRowid; 
10a40 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f        /* Rowid o
10a50 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  f the next row t
10a60 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  o insert */.    
10a70 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f    int addrInsLoo
10a80 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  p;    /* Top of 
10a90 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73  the loop for ins
10aa0 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20  erting rows */. 
10ab0 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
10ac0 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61  Tab;     /* A ta
10ad0 62 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ble that describ
10ae0 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  es the SELECT re
10af0 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20  sults */..      
10b00 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61  regYield = ++pPa
10b10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
10b20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72   regRec = ++pPar
10b30 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10b40 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
10b50 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
10b60 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
10b70 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
10b80 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
10b90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
10ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10bb0 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
10bc0 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
10bd0 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
10be0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10bf0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
10c00 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
10c10 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
10c20 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20  ;.      addrTop 
10c30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
10c40 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
10c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10c60 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10c70 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
10c80 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54  gYield, 0, addrT
10c90 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  op);.      if( p
10ca0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
10cb0 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c  turn;.      pSel
10cc0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
10cd0 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
10ce0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
10cf0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54  .      if( pSelT
10d00 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
10d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10d20 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
10d30 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
10d40 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
10d50 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54   p->aCol = pSelT
10d60 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
10d70 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
10d80 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
10d90 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
10da0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
10db0 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
10dc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10dd0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
10de0 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
10df0 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a  ine, regYield);.
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
10e10 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10e20 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
10e30 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
10e40 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
10e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
10e60 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72  ndCoroutine(v, r
10e70 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  egYield);.      
10e80 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10e90 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d  ere(v, addrTop -
10ea0 20 31 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49   1);.      addrI
10eb0 6e 73 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  nsLoop = sqlite3
10ec0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10ed0 5f 59 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44  _Yield, dest.iSD
10ee0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62  Parm);.      Vdb
10ef0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10f00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f10 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
10f20 52 65 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64  Record, dest.iSd
10f30 73 74 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20  st, dest.nSdst, 
10f40 72 65 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73  regRec);.      s
10f50 71 6c 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e  qlite3TableAffin
10f60 69 74 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20  ity(v, p, 0);.  
10f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10f80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
10f90 6f 77 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69  owid, 1, regRowi
10fa0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
10fb0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10fc0 50 5f 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67  P_Insert, 1, reg
10fd0 52 65 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Rec, regRowid);.
10fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10ff0 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73  eGoto(v, addrIns
11000 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
11010 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11020 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29  (v, addrInsLoop)
11030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11040 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
11050 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  Close, 1);.    }
11060 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
11070 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
11080 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
11090 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
110a0 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
110b0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
110c0 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
110d0 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
110e0 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
110f0 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
11100 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
11110 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
11120 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
11130 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
11140 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
11150 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
11160 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
11170 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
11180 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
11190 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
111a0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
111b0 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
111c0 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
111d0 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
111e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
111f0 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
11200 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
11210 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
11220 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
11230 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
11240 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
11250 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
11260 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
11270 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
11280 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
11290 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
112a0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
112b0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
112c0 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
112d0 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
112e0 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
112f0 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
11300 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
11310 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
11320 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
11330 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
11340 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c  b[iDb].zDbSName,
11350 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20   MASTER_NAME,.  
11360 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
11370 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11380 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
11390 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
113a0 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
113b0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
113c0 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
113d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
113e0 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
113f0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
11400 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
11410 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11420 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
11430 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
11440 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
11450 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
11460 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
11470 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
11480 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
11490 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
114a0 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
114b0 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
114c0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
114d0 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
114e0 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
114f0 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
11500 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11510 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
11520 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
11530 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
11540 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
11550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
11560 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
11570 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11580 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
11590 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
115a0 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
115b0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44           pDb->zD
115c0 62 53 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  bSName.        )
115d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
115e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
115f0 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
11600 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
11610 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
11620 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
11630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
11640 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
11650 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  Db,.           s
11660 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
11670 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
11680 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67   AND type!='trig
11690 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ger'", p->zName)
116a0 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
116b0 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
116c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
116d0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
116e0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
116f0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
11700 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
11710 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
11720 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
11730 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
11740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11750 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11760 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
11770 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
11780 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
11790 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
117a0 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20  >zName, p);.    
117b0 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
117c0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
117d0 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
117e0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
117f0 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
11800 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  rt() */.      sq
11810 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
11820 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
11830 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
11840 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
11850 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
11860 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68  gs |= DBFLAG_Sch
11870 65 6d 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e  emaChange;..#ifn
11880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11890 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
118a0 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
118b0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
118c0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
118d0 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
118e0 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
118f0 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
11900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
11910 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
11920 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
11930 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
11940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
11950 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
11960 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
11970 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
11980 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
11990 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
119a0 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
119b0 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
119c0 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
119d0 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
119e0 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
119f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11a00 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
11a10 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
11a20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
11a30 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
11a40 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
11a50 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
11a60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11a70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
11a80 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
11a90 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
11aa0 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
11ab0 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
11ac0 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
11ad0 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
11ae0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
11af0 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
11b00 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
11b10 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
11b20 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
11b30 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
11b40 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
11b50 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
11b60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61    ExprList *pCNa
11b70 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c  mes, /* Optional
11b80 20 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f   list of view co
11b90 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
11ba0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
11bb0 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
11bc0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
11bd0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
11be0 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
11bf0 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
11c00 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
11c10 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
11c20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
11c30 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
11c40 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
11c50 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
11c60 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
11c70 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
11c80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11c90 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
11ca0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
11cb0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
11cc0 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
11cd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11ce0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
11cf0 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
11d00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11d10 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11d20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
11d30 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
11d40 69 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f  iews");.    goto
11d50 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69   create_view_fai
11d60 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
11d70 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
11d80 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
11d90 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
11da0 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
11db0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11dc0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
11dd0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
11de0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
11df0 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54  fail;.  sqlite3T
11e00 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
11e10 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
11e20 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
11e30 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11e40 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
11e50 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
11e60 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
11e70 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
11e80 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  view", pName);. 
11e90 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
11ea0 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
11eb0 6c 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65  lect) ) goto cre
11ec0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a  ate_view_fail;..
11ed0 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
11ee0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
11ef0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
11f00 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
11f10 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
11f20 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
11f30 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
11f40 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
11f50 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
11f60 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
11f70 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
11f80 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
11f90 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
11fa0 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
11fb0 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
11fc0 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
11fd0 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
11fe0 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  eturns..  */.  i
11ff0 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
12000 45 43 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53  ECT ){.    p->pS
12010 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b  elect = pSelect;
12020 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30  .    pSelect = 0
12030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12040 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
12050 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
12060 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
12070 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20  P_REDUCE);.  }. 
12080 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c   p->pCheck = sql
12090 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
120a0 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50  db, pCNames, EXP
120b0 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
120c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
120d0 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61  iled ) goto crea
120e0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
120f0 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
12100 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
12110 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
12120 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
12130 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
12140 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
12150 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
12160 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ken;.  assert( s
12170 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73  End.z[0]!=0 || s
12180 45 6e 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66  End.n==0 );.  if
12190 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27  ( sEnd.z[0]!=';'
121a0 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b   ){.    sEnd.z +
121b0 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20  = sEnd.n;.  }.  
121c0 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20  sEnd.n = 0;.  n 
121d0 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d  = (int)(sEnd.z -
121e0 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61   pBegin->z);.  a
121f0 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
12200 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
12210 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
12220 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
12230 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
12240 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
12250 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
12260 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
12270 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
12280 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
12290 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
122a0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
122b0 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
122c0 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
122d0 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69  .create_view_fai
122e0 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  l:.  sqlite3Sele
122f0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12300 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 49 4e 5f  lect);.  if( IN_
12310 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
12320 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61  .    sqlite3Rena
12330 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d 61 70 28  meExprlistUnmap(
12340 70 50 61 72 73 65 2c 20 70 43 4e 61 6d 65 73 29  pParse, pCNames)
12350 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
12360 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
12370 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65  , pCNames);.  re
12380 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
12390 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
123a0 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
123b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
123c0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
123d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
123e0 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
123f0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
12400 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
12410 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
12420 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
12430 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
12440 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
12450 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
12460 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
12470 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
12480 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
12490 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
124a0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
124b0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
124c0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
124d0 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
124e0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
124f0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
12500 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
12510 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
12520 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
12530 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
12540 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
12550 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
12560 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
12570 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
12580 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
12590 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
125a0 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
125b0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
125c0 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
125d0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
125e0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
125f0 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
12600 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
12610 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
12620 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
12630 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
12640 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
12650 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
12660 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12670 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12680 42 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65  BLE.  int rc;.#e
12690 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
126a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
126b0 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  ZATION.  sqlite3
126c0 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20  _xauth xAuth;   
126d0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75      /* Saved xAu
126e0 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65  th pointer */.#e
126f0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12700 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
12710 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12720 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62  IRTUALTABLE.  db
12730 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b  ->nSchemaLock++;
12740 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
12750 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70  tabCallConnect(p
12760 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a  Parse, pTable);.
12770 20 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63    db->nSchemaLoc
12780 6b 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  k--;.  if( rc ){
12790 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
127a0 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
127b0 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
127c0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
127d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
127e0 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
127f0 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
12800 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
12810 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
12820 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
12830 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
12840 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
12850 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
12860 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
12870 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
12880 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
12890 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
128a0 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
128b0 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
128c0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
128d0 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
128e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
128f0 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
12900 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
12910 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
12920 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
12930 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
12940 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
12950 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
12960 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
12970 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
12980 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
12990 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
129a0 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
129b0 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
129c0 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
129d0 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
129e0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
129f0 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
12a00 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
12a10 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
12a20 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
12a30 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
12a40 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
12a50 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
12a60 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
12a70 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
12a80 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
12a90 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
12aa0 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
12ab0 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
12ac0 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
12ad0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
12ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12af0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
12b00 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
12b10 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
12b20 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
12b30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
12b40 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
12b50 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
12b60 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
12b70 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
12b80 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
12b90 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
12ba0 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
12bb0 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
12bc0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
12bd0 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
12be0 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
12bf0 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
12c00 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
12c10 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
12c20 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
12c30 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
12c40 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
12c50 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
12c60 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
12c70 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
12c80 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
12c90 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
12ca0 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
12cb0 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
12cc0 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
12cd0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
12ce0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
12cf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
12d00 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
12d10 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
12d20 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
12d30 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
12d40 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b  );.  if( pSel ){
12d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12d60 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
12d70 20 20 20 20 75 38 20 65 50 61 72 73 65 4d 6f 64      u8 eParseMod
12d80 65 20 3d 20 70 50 61 72 73 65 2d 3e 65 50 61 72  e = pParse->ePar
12d90 73 65 4d 6f 64 65 3b 0a 20 20 20 20 70 50 61 72  seMode;.    pPar
12da0 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d  se->eParseMode =
12db0 20 50 41 52 53 45 5f 4d 4f 44 45 5f 4e 4f 52 4d   PARSE_MODE_NORM
12dc0 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  AL;.#endif.    n
12dd0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
12de0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
12df0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
12e00 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
12e10 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65  Src);.    pTable
12e20 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
12e30 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
12e40 44 69 73 61 62 6c 65 2b 2b 3b 0a 23 69 66 6e 64  Disable++;.#ifnd
12e50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12e60 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
12e70 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
12e80 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
12e90 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
12ea0 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
12eb0 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
12ec0 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
12ed0 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
12ee0 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
12ef0 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
12f00 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12f10 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
12f20 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 72 73  #endif.    pPars
12f30 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20  e->nTab = n;.   
12f40 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68   if( pTable->pCh
12f50 65 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  eck ){.      /* 
12f60 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d 65  CREATE VIEW name
12f70 28 61 72 67 6c 69 73 74 29 20 41 53 20 2e 2e 2e  (arglist) AS ...
12f80 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6e 61  .      ** The na
12f90 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
12fa0 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
12fb0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 0a 20  are taken from. 
12fc0 20 20 20 20 20 2a 2a 20 61 72 67 6c 69 73 74 20       ** arglist 
12fd0 77 68 69 63 68 20 69 73 20 73 74 6f 72 65 64 20  which is stored 
12fe0 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  in pTable->pChec
12ff0 6b 2e 20 20 54 68 65 20 70 43 68 65 63 6b 20 66  k.  The pCheck f
13000 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  ield.      ** no
13010 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20 43 48 45  rmally holds CHE
13020 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
13030 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  n an ordinary ta
13040 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a 20 20 20  ble, but for.   
13050 20 20 20 2a 2a 20 61 20 56 49 45 57 20 69 74 20     ** a VIEW it 
13060 68 6f 6c 64 73 20 74 68 65 20 6c 69 73 74 20 6f  holds the list o
13070 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a  f column names..
13080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
13090 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
130a0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
130b0 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b  , pTable->pCheck
130c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e 43 6f      &pTable->nCo
130f0 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l, &pTable->aCol
13100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
13110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
13120 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 72   .       && pPar
13130 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20 20 20 20  se->nErr==0.    
13140 20 20 20 26 26 20 70 54 61 62 6c 65 2d 3e 6e 43     && pTable->nC
13150 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c 69 73 74  ol==pSel->pEList
13160 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b  ->nExpr.      ){
13170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13180 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  SelectAddColumnT
13190 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
131a0 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2c 20  pParse, pTable, 
131b0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
131c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
131d0 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lTab ){.      /*
131e0 20 43 52 45 41 54 45 20 56 49 45 57 20 6e 61 6d   CREATE VIEW nam
131f0 65 20 41 53 2e 2e 2e 20 20 77 69 74 68 6f 75 74  e AS...  without
13200 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 6c 69 73   an argument lis
13210 74 2e 20 20 43 6f 6e 73 74 72 75 63 74 0a 20 20  t.  Construct.  
13220 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d      ** the colum
13230 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 74 68 65  n names from the
13240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13250 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
13260 68 65 20 76 69 65 77 2e 0a 20 20 20 20 20 20 2a  he view..      *
13270 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13280 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
13290 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
132a0 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
132b0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
132c0 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
132d0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
132e0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
132f0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
13300 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
13310 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
13320 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
13330 64 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d  d(db, 0, pTable-
13340 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
13350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
13360 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
13370 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
13380 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
13390 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
133a0 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  SelTab);.    sql
133b0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
133c0 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  (db, pSel);.    
133d0 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
133e0 69 73 61 62 6c 65 2d 2d 3b 0a 23 69 66 6e 64 65  isable--;.#ifnde
133f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
13400 54 45 52 54 41 42 4c 45 0a 20 20 20 20 70 50 61  TERTABLE.    pPa
13410 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 20  rse->eParseMode 
13420 3d 20 65 50 61 72 73 65 4d 6f 64 65 3b 0a 23 65  = eParseMode;.#e
13430 6e 64 69 66 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ndif.  } else {.
13440 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
13450 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
13460 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
13470 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
13480 73 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  s;.  if( db->mal
13490 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
134a0 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
134b0 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
134c0 61 62 6c 65 29 3b 0a 20 20 20 20 70 54 61 62 6c  able);.    pTabl
134d0 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->aCol = 0;.   
134e0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
134f0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
13500 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
13510 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
13520 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
13530 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13540 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
13550 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13560 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
13570 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
13580 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
13590 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
135a0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
135b0 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
135c0 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
135d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
135e0 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
135f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
13600 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
13610 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
13620 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13630 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
13640 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
13650 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
13660 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
13670 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
13680 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
13690 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
136a0 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
136b0 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
136c0 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
136d0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
136e0 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
136f0 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
13700 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
13710 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
13720 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
13730 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
13740 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
13750 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
13760 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
13770 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
13780 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
13790 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
137a0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
137b0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
137c0 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
137d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
137e0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
137f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13800 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
13810 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
13820 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
13830 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
13840 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
13850 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
13860 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
13870 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
13880 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
13890 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
138a0 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
138b0 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
138c0 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
138d0 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
138e0 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
138f0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
13900 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
13910 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
13920 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
13930 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
13940 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
13950 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
13960 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
13970 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
13980 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
13990 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
139a0 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
139b0 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
139c0 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
139d0 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
139e0 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
139f0 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
13a00 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
13a10 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
13a20 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
13a30 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
13a40 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
13a50 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
13a60 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
13a70 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
13a80 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
13a90 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
13aa0 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
13ab0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
13ac0 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
13ad0 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
13ae0 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
13af0 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
13b00 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
13b10 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
13b20 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
13b30 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
13b40 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
13b50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
13b60 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13b70 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
13b80 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
13b90 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
13ba0 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
13bb0 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
13bc0 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
13bd0 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
13be0 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
13bf0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
13c00 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
13c10 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
13c20 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
13c30 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
13c40 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
13c50 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
13c60 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
13c70 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
13c80 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
13c90 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
13ca0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
13cb0 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
13cc0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
13cd0 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
13ce0 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
13cf0 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
13d00 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
13d10 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
13d20 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
13d30 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
13d40 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
13d50 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
13d60 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
13d70 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
13d80 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
13d90 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
13da0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
13db0 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
13dc0 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
13dd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
13de0 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
13df0 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
13e00 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
13e10 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
13e20 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
13e30 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
13e40 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
13e50 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
13e60 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
13e70 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
13e80 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
13e90 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
13ea0 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
13eb0 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
13ec0 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
13ed0 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
13ee0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
13ef0 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
13f00 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
13f10 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
13f20 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
13f30 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
13f40 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
13f50 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13f60 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
13f70 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
13f80 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13f90 69 54 61 62 6c 65 3c 32 20 29 20 73 71 6c 69 74  iTable<2 ) sqlit
13fa0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13fb0 65 2c 20 22 63 6f 72 72 75 70 74 20 73 63 68 65  e, "corrupt sche
13fc0 6d 61 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ma");.  sqlite3V
13fd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13fe0 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
13ff0 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
14000 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
14010 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
14020 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14030 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
14040 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
14050 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
14060 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
14070 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
14080 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
14090 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
140a0 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
140b0 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
140c0 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
140d0 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
140e0 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
140f0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
14100 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
14110 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
14120 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
14130 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
14140 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
14150 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
14160 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
14170 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
14180 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
14190 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
141a0 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
141b0 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
141c0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
141d0 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
141e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
141f0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
14200 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
14210 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
14220 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
14230 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
14240 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
14250 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
14260 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61 62 6c  STER_NAME, iTabl
14270 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
14280 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
14290 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
142a0 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
142b0 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
142c0 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
142d0 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
142e0 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
142f0 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
14300 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
14310 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
14320 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
14330 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
14340 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
14350 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
14360 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
14370 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
14380 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
14390 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
143a0 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
143b0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
143c0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
143d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
143e0 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
143f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
14400 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 2f 2a  ble *pTab){.  /*
14410 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14420 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
14430 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
14440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14450 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
14460 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
14470 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
14480 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
14490 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
144a0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
144b0 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
144c0 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
144d0 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
144e0 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
144f0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
14500 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
14510 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
14520 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
14530 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
14540 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
14550 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
14560 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
14570 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
14580 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
14590 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
145a0 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
145b0 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
145c0 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
145d0 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
145e0 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
145f0 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
14600 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
14610 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
14620 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
14630 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
14640 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
14650 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
14660 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
14670 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
14680 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
14690 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
146a0 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
146b0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
146c0 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
146d0 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
146e0 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
146f0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
14700 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
14710 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
14720 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
14730 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
14740 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
14750 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
14760 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
14770 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
14780 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
14790 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
147a0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
147b0 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
147c0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
147d0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
147e0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
147f0 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
14800 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
14810 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
14820 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
14830 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
14840 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
14850 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
14860 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
14870 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
14880 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
14890 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
148a0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
148b0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
148c0 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
148d0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
148e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
148f0 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
14900 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
14910 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
14920 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
14930 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
14940 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14950 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
14960 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
14970 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
14980 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
14990 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
149a0 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
149b0 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
149c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
149d0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
149e0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
149f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
14a00 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
14a10 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
14a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14a30 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
14a40 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
14a50 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
14a60 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
14a70 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
14a80 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
14a90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
14aa0 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
14ab0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
14ac0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
14ad0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
14ae0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
14af0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34  .  for(i=1; i<=4
14b00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
14b10 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73   zTab[24];.    s
14b20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
14b30 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61  sizeof(zTab),zTa
14b40 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64  b,"sqlite_stat%d
14b50 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ",i);.    if( sq
14b60 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
14b70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c  Parse->db, zTab,
14b80 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20   zDbName) ){.   
14b90 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
14ba0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
14bb0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
14bc0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25  OM %Q.%s WHERE %
14bd0 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a  s=%Q",.        z
14be0 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54  DbName, zTab, zT
14bf0 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20  ype, zName.     
14c00 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
14c10 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14c20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74  code to drop a t
14c30 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  able..*/.void sq
14c40 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
14c50 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
14c60 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69  , Table *pTab, i
14c70 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69  nt iDb, int isVi
14c80 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  ew){.  Vdbe *v;.
14c90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14ca0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72  pParse->db;.  Tr
14cb0 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
14cc0 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  .  Db *pDb = &db
14cd0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76  ->aDb[iDb];..  v
14ce0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
14cf0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
14d00 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
14d10 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
14d20 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
14d30 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
14d40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14d50 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
14d60 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14d70 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14d80 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
14d90 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23  P_VBegin);.  }.#
14da0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
14db0 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
14dc0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14dd0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
14de0 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a  opped. Code.  **
14df0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
14e00 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   remove entries 
14e10 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
14e20 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73  er and/or.  ** s
14e30 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
14e40 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
14e50 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d   */.  pTrigger =
14e60 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
14e70 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
14e80 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69  );.  while( pTri
14e90 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65  gger ){.    asse
14ea0 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53  rt( pTrigger->pS
14eb0 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63  chema==pTab->pSc
14ec0 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20  hema || .       
14ed0 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
14ee0 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
14ef0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
14f00 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
14f10 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
14f20 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67  gger);.    pTrig
14f30 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
14f40 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  pNext;.  }..#ifn
14f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14f60 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
14f70 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
14f80 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
14f90 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
14fa0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
14fb0 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  th.  ** the tabl
14fc0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
14fd0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
14fe0 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
14ff0 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61  s dropped.  ** a
15000 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65  t the btree leve
15010 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  l, in case the s
15020 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
15030 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20  able needs to.  
15040 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73  ** move as a res
15050 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20  ult of the drop 
15060 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61  (can happen in a
15070 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29  uto-vacuum mode)
15080 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
15090 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
150a0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
150b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  {.    sqlite3Nes
150c0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
150d0 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
150e0 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  ROM %Q.sqlite_se
150f0 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d  quence WHERE nam
15100 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62  e=%Q",.      pDb
15110 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54 61 62  ->zDbSName, pTab
15120 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
15130 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15140 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f  Drop all SQLITE_
15150 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64  MASTER table and
15160 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74   index entries t
15170 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
15180 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65  .  ** table. The
15190 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f   program name lo
151a0 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ops through the 
151b0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
151c0 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76   deletes.  ** ev
151d0 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65 66  ery row that ref
151e0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f  ers to a table o
151f0 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  f the same name 
15200 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67  as the one being
15210 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54  .  ** dropped. T
15220 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64  riggers are hand
15230 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62  led separately b
15240 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72  ecause a trigger
15250 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65   can be.  ** cre
15260 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70  ated in the temp
15270 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72   database that r
15280 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
15290 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a   in another.  **
152a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
152b0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
152c0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
152d0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
152e0 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c   %Q.%s WHERE tbl
152f0 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70  _name=%Q and typ
15300 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20  e!='trigger'",. 
15310 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61       pDb->zDbSNa
15320 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
15330 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
15340 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20   if( !isView && 
15350 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
15360 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54   ){.    destroyT
15370 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
15380 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  b);.  }..  /* Re
15390 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
153a0 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
153b0 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
153c0 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
153d0 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
153e0 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  okie..  */.  if(
153f0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
15400 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
15410 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15420 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
15430 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
15440 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
15450 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
15460 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69   OP_DropTable, i
15470 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e  Db, 0, 0, pTab->
15480 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  zName, 0);.  sql
15490 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65  ite3ChangeCookie
154a0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
154b0 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
154c0 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a  All(db, iDb);.}.
154d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
154e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
154f0 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20   do the work of 
15500 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61  a DROP TABLE sta
15510 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65  tement..** pName
15520 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
15530 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
15540 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64  dropped..*/.void
15550 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
15560 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15570 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
15580 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74   int isView, int
15590 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65   noErr){.  Table
155a0 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a   *pTab;.  Vdbe *
155b0 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
155c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
155d0 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28   int iDb;..  if(
155e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
155f0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
15600 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15610 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
15620 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
15630 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
15640 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
15650 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  ( sqlite3ReadSch
15660 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f  ema(pParse) ) go
15670 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
15680 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  le;.  if( noErr 
15690 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
156a0 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r++;.  assert( i
156b0 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
156c0 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45 57 20  ew==LOCATE_VIEW 
156d0 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  );.  pTab = sqli
156e0 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
156f0 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  em(pParse, isVie
15700 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29  w, &pName->a[0])
15710 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
15720 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
15730 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
15740 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
15750 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
15760 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
15770 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
15780 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
15790 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
157a0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
157b0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
157c0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
157d0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
157e0 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
157f0 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
15800 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
15810 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
15820 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
15830 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
15840 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
15850 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
15860 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
15870 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
15880 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
15890 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
158a0 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
158b0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
158c0 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
158d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
158e0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
158f0 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
15900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
15910 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
15920 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
15930 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
15940 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
15950 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
15960 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
15970 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
15980 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
15990 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
159a0 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
159b0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
159c0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
159d0 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
159e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
159f0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
15a00 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
15a10 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15a20 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
15a30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15a40 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
15a50 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
15a60 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15a70 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
15a80 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
15a90 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
15aa0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
15ab0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
15ac0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
15ad0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
15ae0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
15af0 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
15b00 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
15b10 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
15b20 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
15b30 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
15b40 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
15b50 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
15b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
15b70 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
15b80 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
15b90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15ba0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
15bb0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
15bc0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
15bd0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15be0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15bf0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
15c00 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
15c10 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
15c20 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
15c30 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
15c40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
15c50 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
15c60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15c70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
15c80 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
15c90 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
15ca0 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
15cb0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15cc0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15cd0 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
15ce0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
15cf0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
15d00 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
15d10 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
15d20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
15d30 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15d40 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
15d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
15d60 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
15d70 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
15d80 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
15d90 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
15da0 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
15db0 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
15dc0 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
15dd0 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
15de0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15df0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15e00 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
15e10 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
15e20 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
15e30 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
15e40 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
15e50 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
15e60 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
15e70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15e80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
15e90 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
15ea0 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
15eb0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
15ec0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15ed0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15ee0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
15ef0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
15f00 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
15f10 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
15f20 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
15f30 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
15f40 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
15f50 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
15f60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
15f70 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
15f80 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
15f90 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
15fa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15fb0 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
15fc0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74  (pParse, iDb, "t
15fd0 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  bl", pTab->zName
15fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ff0 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  FkDropTable(pPar
16000 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29  se, pName, pTab)
16010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16020 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
16030 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
16040 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
16050 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
16060 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
16070 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
16080 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
16090 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
160a0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
160b0 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
160c0 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
160d0 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
160e0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
160f0 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
16100 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
16110 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
16120 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
16130 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
16140 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
16150 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
16160 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
16170 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
16180 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
16190 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
161a0 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
161b0 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
161c0 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
161d0 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
161e0 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
161f0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
16200 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
16210 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
16220 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
16230 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
16240 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
16250 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
16260 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
16270 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
16280 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
16290 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
162a0 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
162b0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
162c0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
162d0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
162e0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
162f0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
16300 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
16310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
16320 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
16330 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
16340 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
16350 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
16360 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16370 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
16380 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
16390 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
163a0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
163b0 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
163c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
163d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
163e0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
163f0 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
16400 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
16410 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
16420 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
16430 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
16440 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
16450 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
16460 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
16470 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
16480 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
16490 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
164a0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
164b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
164c0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
164d0 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
164e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
164f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
16500 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16510 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
16520 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
16530 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
16540 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
16550 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
16560 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
16570 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
16580 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
16590 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
165a0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
165b0 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
165c0 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
165d0 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
165e0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
165f0 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
16600 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
16610 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
16620 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
16630 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
16640 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
16650 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16660 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
16670 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
16680 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
16690 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
166a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
166b0 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
166c0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
166d0 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
166e0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
166f0 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
16700 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
16710 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
16720 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
16730 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
16740 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
16750 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
16760 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
16770 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
16780 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
16790 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
167a0 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
167b0 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
167c0 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
167d0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
167e0 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
167f0 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
16800 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
16810 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
16820 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
16830 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
16840 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
16850 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
16860 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
16870 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
16880 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
16890 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
168a0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
168b0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
168c0 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
168d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
168e0 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
168f0 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
16900 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
16910 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
16920 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
16930 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
16940 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
16950 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
16960 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
16970 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28  ->zTo = z;.  if(
16980 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
16990 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
169a0 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
169b0 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
169c0 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d   pTo);.  }.  mem
169d0 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
169e0 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
169f0 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
16a00 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
16a10 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
16a20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
16a30 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
16a40 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
16a50 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
16a60 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
16a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
16a80 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
16a90 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
16aa0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
16ab0 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
16ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
16ad0 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
16ae0 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
16af0 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
16b00 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
16b10 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16b20 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
16b30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16b50 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
16b60 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
16b70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16b80 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
16b90 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
16ba0 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
16bb0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
16bc0 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
16bd0 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
16be0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
16bf0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
16c00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16c10 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
16c20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16c30 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
16c40 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70 46 4b  map(pParse, &pFK
16c50 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72  ey->aCol[i], pFr
16c60 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
16c70 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16c80 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
16c90 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
16ca0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
16cb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
16cc0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
16cd0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16ce0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
16cf0 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
16d00 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f  z;.      if( IN_
16d10 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
16d20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16d30 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
16d40 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43  (pParse, z, pToC
16d50 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
16d60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
16d70 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d  emcpy(z, pToCol-
16d80 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b  >a[i].zName, n);
16d90 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b  .      z[n] = 0;
16da0 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b  .      z += n+1;
16db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
16dc0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
16dd0 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   0;.  pFKey->aAc
16de0 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66  tion[0] = (u8)(f
16df0 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20  lags & 0xff);   
16e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44           /* ON D
16e10 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  ELETE action */.
16e20 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e    pFKey->aAction
16e30 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67  [1] = (u8)((flag
16e40 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29  s >> 8 ) & 0xff)
16e50 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54  ;    /* ON UPDAT
16e60 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  E action */..  a
16e70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
16e80 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
16e90 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  , 0, p->pSchema)
16ea0 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20   );.  pNextTo = 
16eb0 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48  (FKey *)sqlite3H
16ec0 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53  ashInsert(&p->pS
16ed0 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c  chema->fkeyHash,
16ee0 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a   .      pFKey->z
16ef0 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46 4b 65  To, (void *)pFKe
16f00 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  y.  );.  if( pNe
16f10 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20  xtTo==pFKey ){. 
16f20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
16f30 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f  lt(db);.    goto
16f40 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69   fk_end;.  }.  i
16f50 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20  f( pNextTo ){.  
16f60 20 20 61 73 73 65 72 74 28 20 70 4e 65 78 74 54    assert( pNextT
16f70 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b  o->pPrevTo==0 );
16f80 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  .    pFKey->pNex
16f90 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20  tTo = pNextTo;. 
16fa0 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65     pNextTo->pPre
16fb0 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d  vTo = pFKey;.  }
16fc0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
16fd0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
16fe0 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
16ff0 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
17000 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
17010 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
17020 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
17030 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
17040 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
17050 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17060 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
17070 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
17080 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
17090 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
170a0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
170b0 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
170c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
170d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
170e0 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
170f0 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
17100 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
17110 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
17120 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
17130 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
17140 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
17150 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
17160 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
17170 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
17180 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
17190 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
171a0 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
171b0 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
171c0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
171d0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
171e0 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
171f0 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
17200 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
17210 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
17220 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
17230 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
17240 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
17250 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
17260 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
17270 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
17280 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
17290 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
172a0 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
172b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
172c0 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
172d0 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
172e0 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a  red==1 ); /* EV:
172f0 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a   R-30323-21917 *
17300 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  /.  pFKey->isDef
17310 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
17320 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
17330 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
17340 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
17350 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
17360 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
17370 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
17380 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
17390 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
173a0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
173b0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
173c0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
173d0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
173e0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
173f0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
17400 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
17410 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
17420 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
17430 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
17440 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
17450 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
17460 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
17470 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
17480 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17490 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
174a0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
174b0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
174c0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
174d0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
174e0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
174f0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
17500 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
17510 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
17520 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
17530 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
17540 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
17550 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
17560 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
17570 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
17580 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
17590 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
175a0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
175b0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
175c0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
175d0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
175e0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
175f0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
17600 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
17610 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
17620 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
17630 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
17640 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
17650 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
17660 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20   int iSorter;   
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64  /* Cursor opened
17690 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28   by OpenSorter (
176a0 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20  if in use) */.  
176b0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70  * Address of top
176e0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
176f0 74 20 61 64 64 72 32 3b 20 20 20 20 20 20 20 20  t addr2;        
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17710 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20  Address to jump 
17720 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  to for next iter
17730 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74  ation */.  int t
17740 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
17750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
17760 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20  t page of index 
17770 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64  */.  int iPartId
17780 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20  xLabel;         
17790 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74      /* Jump to t
177a0 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69  his label to ski
177b0 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62  p a row */.  Vdb
177c0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
177d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
177e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
177f0 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  o this virtual m
17800 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49  achine */.  KeyI
17810 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20  nfo *pKey;      
17820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
17830 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20  yInfo for index 
17840 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
17850 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
17860 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
17870 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65  holding assemble
17880 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  d index record *
17890 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
178a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
178b0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
178c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
178d0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
178e0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
178f0 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
17900 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
17910 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17920 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
17930 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17940 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
17950 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78  _REINDEX, pIndex
17960 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20  ->zName, 0,.    
17970 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
17980 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20  DbSName ) ){.   
17990 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
179a0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72  dif..  /* Requir
179b0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
179c0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 70  n the table to p
179d0 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70 65 72  erform this oper
179e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ation */.  sqlit
179f0 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
17a00 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
17a10 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e  num, 1, pTab->zN
17a20 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c  ame);..  v = sql
17a30 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
17a40 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
17a50 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
17a60 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29  memRootPage>=0 )
17a70 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d  {.    tnum = mem
17a80 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73  RootPage;.  }els
17a90 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 70 49  e{.    tnum = pI
17aa0 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a  ndex->tnum;.  }.
17ab0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
17ac0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
17ad0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a  Parse, pIndex);.
17ae0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
17af0 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
17b00 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
17b10 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f  >nErr );..  /* O
17b20 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
17b30 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
17b40 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
17b50 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
17b60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
17b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17b80 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
17b90 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e   iSorter, 0, pIn
17ba0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63  dex->nKeyCol, (c
17bb0 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
17bc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17bd0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
17be0 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
17bf0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
17c00 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
17c10 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
17c20 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
17c30 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
17c40 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
17c50 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
17c60 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
17c70 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
17c80 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
17c90 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
17ca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17cb0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
17cc0 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
17cd0 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
17ce0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
17cf0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17d00 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75 6c 74  );.  sqlite3Mult
17d10 69 57 72 69 74 65 28 70 50 61 72 73 65 29 3b 0a  iWrite(pParse);.
17d20 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  .  sqlite3Genera
17d30 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73  teIndexKey(pPars
17d40 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65  e,pIndex,iTab,re
17d50 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74  gRecord,0,&iPart
17d60 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20  IdxLabel,0,0);. 
17d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17d80 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
17d90 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  nsert, iSorter, 
17da0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
17db0 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74  lite3ResolvePart
17dc0 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c  IdxLabel(pParse,
17dd0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b   iPartIdxLabel);
17de0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17df0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
17e00 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b   iTab, addr1+1);
17e10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17e20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
17e30 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
17e40 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  );.  if( memRoot
17e50 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33  Page<0 ) sqlite3
17e60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17e70 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44  _Clear, tnum, iD
17e80 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
17e90 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
17ea0 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74  enWrite, iIdx, t
17eb0 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20  num, iDb, .     
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17ed0 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f  char *)pKey, P4_
17ee0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
17ef0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
17f00 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53  v, OPFLAG_BULKCS
17f10 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  R|((memRootPage>
17f20 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52  =0)?OPFLAG_P2ISR
17f30 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31  EG:0));..  addr1
17f40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
17f50 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
17f60 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20  rSort, iSorter, 
17f70 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
17f80 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  (v);.  if( IsUni
17f90 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
17fa0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
17fb0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
17fc0 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64 64 72  (v, 1);.    addr
17fd0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
17fe0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 56 65     sqlite3VdbeVe
18000 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28 76 2c  rifyAbortable(v,
18010 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20   OE_Abort);.    
18020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18030 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
18040 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
18050 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
18060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18070 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
18080 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
18090 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
180a0 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
180b0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
180c0 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
180d0 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
180e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
180f0 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  j2);.  }else{.  
18100 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
18110 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
18120 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
18130 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18140 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
18150 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
18160 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
18170 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
18180 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64   OP_SeekEnd, iId
18190 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
181a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
181b0 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72  xInsert, iIdx, r
181c0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
181d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
181e0 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
181f0 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
18200 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18210 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
18220 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
18230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18240 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
18250 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
18260 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18270 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
18280 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
18290 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
182a0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
182b0 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
182c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
182d0 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
182e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
182f0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
18300 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
18310 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
18320 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
18330 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
18340 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
18350 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
18360 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
18370 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
18380 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
18390 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
183a0 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
183b0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
183c0 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
183d0 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
183e0 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
183f0 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
18400 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
18410 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
18420 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
18430 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
18440 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
18450 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
18460 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
18470 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
18480 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
18490 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
184a0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
184b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
184c0 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
184d0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
184e0 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
184f0 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
18500 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
18510 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
18520 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
18530 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
18540 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
18550 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
18560 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
18570 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
18580 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
18590 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
185a0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
185b0 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
185c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
185d0 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
185e0 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
185f0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
18600 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
18610 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
18620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
18630 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
18640 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
18650 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
18660 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18680 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
18690 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
186a0 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
186b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
186c0 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
186d0 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
186e0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
186f0 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
18700 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
18710 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
18720 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
18730 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
18740 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
18750 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
18760 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
18770 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
18780 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 70  char**)pExtra; p
18790 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
187a0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
187b0 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
187c0 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
187d0 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
187e0 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
187f0 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
18800 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
18810 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
18820 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
18830 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
18840 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
18850 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
18860 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
18870 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
18880 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
18890 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
188a0 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
188b0 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
188c0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
188d0 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
188e0 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
188f0 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
18900 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
18910 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
18920 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
18930 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
18940 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
18950 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
18960 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
18970 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
18980 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
18990 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
189a0 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
189b0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
189c0 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
189d0 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
189e0 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
189f0 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
18a00 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
18a10 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
18a20 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
18a30 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
18a40 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
18a50 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
18a60 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
18a70 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
18a80 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
18a90 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
18aa0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
18ab0 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
18ac0 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
18ad0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
18ae0 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
18af0 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
18b00 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
18b10 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
18b20 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
18b30 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
18b40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18b50 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
18b60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18b70 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
18b80 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
18b90 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
18ba0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
18bb0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
18bc0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
18bd0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
18be0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
18bf0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
18c00 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
18c10 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
18c20 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
18c30 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
18c40 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
18c50 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
18c60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
18c70 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
18c80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
18c90 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
18ca0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
18cb0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
18cc0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
18cd0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
18ce0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
18cf0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
18d00 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
18d10 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
18d20 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
18d30 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
18d40 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18d50 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
18d60 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
18d70 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
18d80 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
18d90 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
18da0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
18db0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c 20 20  nt ifNotExist,  
18dc0 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
18dd0 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
18de0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75 38 20   exists */.  u8 
18df0 69 64 78 54 79 70 65 20 20 20 20 20 20 20 20 20  idxType         
18e00 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 79 70  /* The index typ
18e10 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  e */.){.  Table 
18e20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f  *pTab = 0;     /
18e30 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  * Table to be in
18e40 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  dexed */.  Index
18e50 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20   *pIndex = 0;   
18e60 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
18e70 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  be created */.  
18e80 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
18e90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18ea0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
18eb0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
18ec0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18ed0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
18ee0 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  Name */.  int i,
18ef0 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46   j;.  DbFixer sF
18f00 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
18f10 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
18f20 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
18f30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
18f40 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
18f50 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
18f60 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
18f70 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
18f80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18f90 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
18fa0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
18fb0 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
18fc0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
18fd0 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
18fe0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
18ff0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
19000 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
19010 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
19020 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
19030 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
19040 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
19050 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
19060 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
19070 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
19080 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
19090 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
190a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
190b0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
190c0 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
190d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
190e0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
190f0 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
19100 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
19130 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
19140 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
19150 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
19160 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
19170 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
19180 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
19190 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
191a0 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
191b0 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
191c0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
191d0 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20  ables */..  if( 
191e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
191f0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
19200 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  >0 ){.    goto e
19210 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 44  ;.  }.  if( IN_D
19230 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26 20 69  ECLARE_VTAB && i
19240 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
19250 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45  DXTYPE_PRIMARYKE
19260 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  Y ){.    goto ex
19270 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19280 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
19290 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
192a0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
192b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
192c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
192d0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
192e0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
192f0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
19300 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
19310 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
19320 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
19330 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
19340 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
19350 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
19360 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
19370 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
19380 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
19390 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
193a0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
193b0 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
193c0 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
193d0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
193e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
193f0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
19400 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
19410 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
19420 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
19430 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
19440 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
19450 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
19460 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73  te_index;.    as
19470 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70  sert( pName && p
19480 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e  Name->z );..#ifn
19490 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194a0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
194b0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
194c0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
194d0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61   check if the ta
194e0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  ble.    ** is a 
194f0 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73  temp table. If s
19500 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  o, set the datab
19510 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74  ase to 1. Do not
19520 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   do this.    ** 
19530 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20  if initialising 
19540 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  a database schem
19550 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  a..    */.    if
19560 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
19570 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
19580 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c   sqlite3SrcListL
19590 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54  ookup(pParse, pT
195a0 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  blName);.      i
195b0 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20  f( pName2->n==0 
195c0 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d  && pTab && pTab-
195d0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
195e0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
195f0 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b          iDb = 1;
19600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19610 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
19620 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
19630 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
19640 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ndex", pName);. 
19650 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
19660 78 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20  xSrcList(&sFix, 
19670 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20  pTblName) ){.   
19680 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68     /* Because th
19690 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75  e parser constru
196a0 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f  cts pTblName fro
196b0 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74  m a single ident
196c0 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20  ifier,.      ** 
196d0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
196e0 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c  t can never fail
196f0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
19700 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(0);.    }.    
19710 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
19720 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
19730 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61  arse, 0, &pTblNa
19740 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61  me->a[0]);.    a
19750 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
19760 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54  cFailed==0 || pT
19770 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab==0 );.    if(
19780 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20   pTab==0 ) goto 
19790 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
197a0 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  x;.    if( iDb==
197b0 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62  1 && db->aDb[iDb
197c0 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d  ].pSchema!=pTab-
197d0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
197e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
197f0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
19800 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72        "cannot cr
19810 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65  eate a TEMP inde
19820 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61  x on non-TEMP ta
19830 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20  ble \"%s\"",.   
19840 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
19850 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
19860 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19870 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
19880 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
19890 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65  ) ) pPk = sqlite
198a0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
198b0 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pTab);.  }else{
198c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
198d0 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  me==0 );.    ass
198e0 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29  ert( pStart==0 )
198f0 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
19900 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
19910 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
19920 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19930 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
19940 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
19950 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
19960 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
19970 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
19980 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
19990 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
199a0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
199b0 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
199c0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
199d0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
199e0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
199f0 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74       && db->init
19a00 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c  .busy==0.#if SQL
19a10 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
19a20 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26  ICATION.       &
19a30 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  & sqlite3UserAut
19a40 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61  hTable(pTab->zNa
19a50 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 23 69  me)==0.#endif.#i
19a60 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
19a70 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 5f  W_SQLITE_MASTER_
19a80 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26 26 20  INDEX.       && 
19a90 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 26  sqlite3StrICmp(&
19aa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
19ab0 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65 6e 64  master")!=0.#end
19ac0 69 66 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  if.       && sql
19ad0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54  ite3StrNICmp(&pT
19ae0 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c  ab->zName[7],"al
19af0 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 0a 20  tertab_",9)!=0. 
19b00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
19b10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19b20 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
19b30 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
19b40 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19b50 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19b60 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
19b70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19b80 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
19b90 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
19ba0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19bb0 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
19bc0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
19bd0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
19be0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19bf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
19c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19c10 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
19c20 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
19c30 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
19c40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19c50 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
19c60 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
19c70 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
19c80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19c90 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
19ca0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
19cb0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
19cc0 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
19cd0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
19ce0 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
19cf0 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
19d00 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
19d10 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
19d20 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
19d30 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
19d40 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
19d50 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
19d60 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
19d70 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
19d80 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
19d90 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
19da0 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
19db0 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
19dc0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
19dd0 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
19de0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
19df0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
19e00 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
19e10 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
19e20 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
19e30 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
19e40 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
19e50 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
19e60 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
19e70 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
19e80 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
19e90 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
19ea0 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
19eb0 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
19ec0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
19ed0 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
19ee0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
19ef0 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
19f00 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
19f10 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
19f20 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
19f30 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
19f40 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
19f50 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
19f60 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
19f70 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
19f80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19f90 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19fa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
19fb0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
19fc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 64   ){.      if( !d
19fd0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
19fe0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
19ff0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1a000 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
1a010 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1a020 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a030 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
1a040 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
1a050 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
1a060 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1a070 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a090 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 71    }.      if( sq
1a0a0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1a0b0 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a  b, zName, pDb->z
1a0c0 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  DbSName)!=0 ){. 
1a0d0 20 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f         if( !ifNo
1a0e0 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
1a0f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a100 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
1a110 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78  ex %s already ex
1a120 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ists", zName);. 
1a130 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1a140 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a150 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
1a160 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1a170 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1a180 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
1a190 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a1a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1a1b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a1c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1a1d0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
1a1e0 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
1a1f0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
1a200 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
1a210 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
1a220 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
1a230 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
1a240 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1a250 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
1a260 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
1a270 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
1a280 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
1a290 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a2a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a2b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 75 74     }..    /* Aut
1a2c0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d  omatic index nam
1a2d0 65 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  es generated fro
1a2e0 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74 65 33  m within sqlite3
1a2f0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 0a  _declare_vtab().
1a300 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61 76 65      ** must have
1a310 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
1a320 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 6e 6f  distinct from no
1a330 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63 20 69  rmal automatic i
1a340 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20 20 20  ndex names..    
1a350 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a360 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 76 65   statement conve
1a370 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61 75 74  rts "sqlite3_aut
1a380 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74 6f 0a  oindex..." into.
1a390 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65 33 5f      ** "sqlite3_
1a3a0 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e  butoindex..." in
1a3b0 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 74   order to make t
1a3c0 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69 6e 63  he names distinc
1a3d0 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 76  t..    ** The "v
1a3e0 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20 74 65  tab_err.test" te
1a3f0 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65 73 20  st demonstrates 
1a400 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68 69 73  the need of this
1a410 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
1a420 20 20 20 69 66 28 20 49 4e 5f 53 50 45 43 49 41     if( IN_SPECIA
1a430 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61 6d 65 5b  L_PARSE ) zName[
1a440 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  7]++;.  }..  /* 
1a450 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72  Check for author
1a460 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74  ization to creat
1a470 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  e an index..  */
1a480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a490 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1a4a0 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  ON.  if( !IN_REN
1a4b0 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1a4c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1a4d0 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  b = pDb->zDbSNam
1a4e0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
1a4f0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a500 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
1a510 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
1a520 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b  iDb), 0, zDb) ){
1a530 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a540 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a550 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c     }.    i = SQL
1a560 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58  ITE_CREATE_INDEX
1a570 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  ;.    if( !OMIT_
1a580 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1a590 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52   ) i = SQLITE_CR
1a5a0 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  EATE_TEMP_INDEX;
1a5b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a5c0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a5d0 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62  , i, zName, pTab
1a5e0 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1a5f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1a600 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1a610 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1a620 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d  .  /* If pList==
1a630 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  0, it means this
1a640 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1a650 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72  led to make a pr
1a660 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f  imary.  ** key o
1a670 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63  ut of the last c
1a680 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74  olumn added to t
1a690 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
1a6a0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a  onstruction..  *
1a6b0 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66 61  * So create a fa
1a6c0 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c  ke list to simul
1a6d0 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  ate this..  */. 
1a6e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1a6f0 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65 76 43  .    Token prevC
1a700 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ol;.    Column *
1a710 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1a720 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
1a730 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
1a740 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
1a750 55 4e 49 51 55 45 3b 0a 20 20 20 20 73 71 6c 69  UNIQUE;.    sqli
1a760 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 70 72  te3TokenInit(&pr
1a770 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  evCol, pCol->zNa
1a780 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  me);.    pList =
1a790 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a7a0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1a7b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a7c0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
1a7d0 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65  (db, TK_ID, &pre
1a7e0 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69  vCol, 0));.    i
1a7f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
1a800 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a810 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1a820 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
1a830 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
1a840 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
1a850 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74  rder(pList, sort
1a860 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Order);.  }else{
1a870 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1a880 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
1a890 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22  pParse, pList, "
1a8a0 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20  index");.  }..  
1a8b0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a8c0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
1a8d0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
1a8e0 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
1a8f0 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
1a900 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
1a910 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
1a920 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1a930 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1a940 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1a950 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
1a960 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61  [i].pExpr;.    a
1a970 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20  ssert( pExpr!=0 
1a980 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
1a990 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
1a9a0 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
1a9b0 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
1a9c0 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
1a9d0 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
1a9e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
1a9f0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
1aa00 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
1aa10 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
1aa20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1aa30 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
1aa40 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
1aa50 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
1aa60 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1aa70 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
1aa80 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
1aa90 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
1aaa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
1aad0 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
1aae0 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
1aaf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1ab00 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1ab10 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
1ab20 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1ab30 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1ab40 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
1ab50 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
1ab60 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1ab70 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
1ab80 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
1ab90 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
1aba0 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
1abb0 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
1abc0 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
1abd0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
1abe0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
1abf0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
1ac00 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
1ac10 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
1ac20 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
1ac30 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
1ac40 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
1ac50 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79  >idxType = idxTy
1ac60 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  pe;.  pIndex->pS
1ac70 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
1ac80 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
1ac90 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
1aca0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1acb0 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
1acc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1acd0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
1ace0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
1acf0 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
1ad00 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
1ad10 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
1ad20 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
1ad30 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
1ad40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ad50 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
1ad60 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
1ad70 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
1ad80 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
1ad90 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
1ada0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
1adb0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
1adc0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
1add0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
1ade0 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
1adf0 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
1ae00 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
1ae10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
1ae20 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
1ae30 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
1ae40 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
1ae50 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
1ae60 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
1ae70 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
1ae80 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
1ae90 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
1aea0 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
1aeb0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1aec0 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
1aed0 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
1aee0 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
1aef0 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
1af00 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
1af10 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
1af20 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
1af30 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
1af40 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1af50 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
1af60 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
1af70 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
1af80 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
1af90 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
1afa0 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
1afb0 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
1afc0 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
1afd0 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
1afe0 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
1aff0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
1b000 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
1b010 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
1b020 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74  ey..  */.  pList
1b030 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b  Item = pList->a;
1b040 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
1b050 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70  _OBJECT ){.    p
1b060 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
1b070 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69  = pList;.    pLi
1b080 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f  st = 0;.  }.  fo
1b090 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
1b0a0 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70  >nKeyCol; i++, p
1b0b0 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
1b0c0 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20   Expr *pCExpr;  
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65  /* The i-th inde
1b0f0 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  x expression */.
1b100 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
1b110 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20  dSortOrder;     
1b120 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53     /* ASC or DES
1b130 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78  C on the i-th ex
1b140 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1b150 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1b160 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
1b170 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
1b180 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
1b190 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54    sqlite3StringT
1b1a0 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70  oId(pListItem->p
1b1b0 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
1b1c0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
1b1d0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
1b1e0 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Tab, NC_IdxExpr,
1b1f0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
1b200 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
1b210 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
1b220 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b230 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72  ndex;.    pCExpr
1b240 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1b250 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49  ipCollate(pListI
1b260 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1b270 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21   if( pCExpr->op!
1b280 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1b290 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50      if( pTab==pP
1b2a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
1b2b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b2c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b2d0 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20  e, "expressions 
1b2e0 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52  prohibited in PR
1b2f0 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a  IMARY KEY and ".
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69  "UNIQUE constrai
1b330 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67  nts");.        g
1b340 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1b350 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
1b360 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d       if( pIndex-
1b370 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a  >aColExpr==0 ){.
1b380 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1b390 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74  aColExpr = pList
1b3a0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
1b3b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1b3c0 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a     j = XN_EXPR;.
1b3d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69        pIndex->ai
1b3e0 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45  Column[i] = XN_E
1b3f0 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65  XPR;.      pInde
1b400 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
1b410 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1b420 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d       j = pCExpr-
1b430 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
1b440 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
1b450 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  f );.      if( j
1b460 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  <0 ){.        j 
1b470 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
1b480 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1b490 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
1b4a0 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
1b4b0 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e     pIndex->uniqN
1b4c0 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  otNull = 0;.    
1b4d0 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78    }.      pIndex
1b4e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b4f0 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20  (i16)j;.    }.  
1b500 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20    zColl = 0;.   
1b510 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
1b520 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1b530 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  LLATE ){.      i
1b540 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  nt nColl;.      
1b550 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
1b560 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
1b570 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
1b580 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b590 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
1b5a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
1b5b0 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
1b5c0 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
1b5d0 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
1b5e0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
1b5f0 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
1b600 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
1b610 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
1b620 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oll;.    }else i
1b630 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( j>=0 ){.     
1b640 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
1b650 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
1b660 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f    }.    if( !zCo
1b670 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  ll ) zColl = sql
1b680 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20  ite3StrBINARY;. 
1b690 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
1b6a0 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
1b6b0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
1b6c0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
1b6d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1b6e0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1b6f0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
1b700 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
1b710 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
1b720 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
1b730 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
1b740 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
1b750 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
1b760 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
1b770 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
1b780 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
1b790 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c   Append the tabl
1b7a0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64  e key to the end
1b7b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1b7c0 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  For WITHOUT ROWI
1b7d0 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77  D.  ** tables (w
1b7e0 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73  hen pPk!=0) this
1b7f0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63   will be the dec
1b800 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45  lared PRIMARY KE
1b810 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72  Y.  For.  ** nor
1b820 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e  mal tables (when
1b830 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69   pPk==0) this wi
1b840 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e  ll be the rowid.
1b850 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20  .  */.  if( pPk 
1b860 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
1b870 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
1b880 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
1b890 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
1b8a0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  n[j];.      asse
1b8b0 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( x>=0 );.    
1b8c0 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
1b8d0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b8e0 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
1b8f0 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
1b900 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
1b910 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
1b920 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1b930 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
1b940 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
1b950 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
1b960 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
1b970 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1b980 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
1b990 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
1b9a0 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
1b9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b9c0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
1b9d0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
1b9e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1b9f0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1ba00 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
1ba10 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1ba20 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  i] = sqlite3StrB
1ba30 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  INARY;.  }.  sql
1ba40 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1ba50 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28  t(pIndex);.  if(
1ba60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
1ba70 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65  le==0 ) estimate
1ba80 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65  IndexWidth(pInde
1ba90 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  x);..  /* If thi
1baa0 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73  s index contains
1bab0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
1bac0 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e   its table, then
1bad0 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73   mark.  ** it as
1bae0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1baf0 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48  x */.  assert( H
1bb00 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20  asRowid(pTab) . 
1bb10 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50       || pTab->iP
1bb20 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33  Key<0 || sqlite3
1bb30 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49  ColumnOfIndex(pI
1bb40 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50 4b 65  ndex, pTab->iPKe
1bb50 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63 6f 6d  y)>=0 );.  recom
1bb60 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e  puteColumnsNotIn
1bb70 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b 0a 20  dexed(pIndex);. 
1bb80 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1bb90 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   && pIndex->nCol
1bba0 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  umn>=pTab->nCol 
1bbb0 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 69  ){.    pIndex->i
1bbc0 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20  sCovering = 1;. 
1bbd0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1bbe0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1bbf0 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 54 61        if( j==pTa
1bc00 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e 74 69  b->iPKey ) conti
1bc10 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
1bc20 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1bc30 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e 3d 30  dex(pIndex,j)>=0
1bc40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bc50 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43 6f 76     pIndex->isCov
1bc60 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 20  ering = 0;.     
1bc70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1bc80 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70  }..  if( pTab==p
1bc90 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
1bca0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1bcb0 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e  routine has been
1bcc0 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
1bcd0 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  e an automatic i
1bce0 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a  ndex as a.    **
1bcf0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49   result of a PRI
1bd00 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1bd10 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63  UE clause on a c
1bd20 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1bd30 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52  , or.    ** a PR
1bd40 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
1bd50 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f  QUE clause follo
1bd60 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20  wing the column 
1bd70 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20  definitions..   
1bd80 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a   ** i.e. one of:
1bd90 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
1bda0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20  REATE TABLE t(x 
1bdb0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b  PRIMARY KEY, y);
1bdc0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1bdd0 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49  ABLE t(x, y, UNI
1bde0 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20  QUE(x, y));.    
1bdf0 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72  **.    ** Either
1be00 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73   way, check to s
1be10 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ee if the table 
1be20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68  already has such
1be30 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20   an index. If.  
1be40 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62    ** so, don't b
1be50 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74  other creating t
1be60 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e  his one. This on
1be70 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20  ly applies to.  
1be80 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
1be90 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63  ly created indic
1bea0 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f  es. Users can do
1beb0 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69   as they wish wi
1bec0 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63  th.    ** explic
1bed0 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  it indices..    
1bee0 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e  **.    ** Two UN
1bef0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
1bf00 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  KEY constraints 
1bf10 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1bf20 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a  quivalent.    **
1bf30 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72   (and thus suppr
1bf40 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e  essing the secon
1bf50 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74  d one) even if t
1bf60 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65  hey have differe
1bf70 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f  nt.    ** sort o
1bf80 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20  rders..    **.  
1bf90 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72    ** If there ar
1bfa0 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c  e different coll
1bfb0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
1bfc0 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  or if the column
1bfd0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
1bfe0 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72  constraint occur
1bff0 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72   in different or
1c000 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ders, then the c
1c010 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20  onstraints are. 
1c020 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64     ** considered
1c030 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f   distinct and bo
1c040 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70  th result in sep
1c050 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20  arate indices.. 
1c060 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
1c070 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1c080 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1c090 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
1c0a0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
1c0b0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
1c0c0 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e  sert( IsUniqueIn
1c0d0 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20 20 20  dex(pIdx) );.   
1c0e0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
1c0f0 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
1c100 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20  _IDXTYPE_APPDEF 
1c110 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c120 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
1c130 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20 20 20  Index) );..     
1c140 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43   if( pIdx->nKeyC
1c150 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  ol!=pIndex->nKey
1c160 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Col ) continue;.
1c170 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
1c180 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
1c190 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
1c1a0 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
1c1b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1c1c0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 61 73   *z2;.        as
1c1d0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
1c1e0 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[k]>=0 );.  
1c1f0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1c200 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
1c210 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
1c220 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c230 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43    z1 = pIdx->azC
1c240 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1c250 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  z2 = pIndex->azC
1c260 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
1c270 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1c280 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1c290 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c2a0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1c2b0 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1c2c0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1c2d0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1c2e0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1c2f0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1c300 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1c310 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1c320 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1c330 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1c340 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1c350 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1c360 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1c370 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1c380 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1c390 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1c3a0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1c3b0 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1c3c0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1c3d0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1c3e0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1c3f0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1c400 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1c410 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1c420 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1c430 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1c440 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1c450 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1c460 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1c470 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1c480 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1c490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c4a0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1c4b0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1c4c0 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1c4d0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1c4e0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1c4f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c500 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1c510 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1c520 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1c530 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1c540 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1c550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c560 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1c570 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1c580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1c590 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1c5a0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1c5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c5d0 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  ( idxType==SQLIT
1c5e0 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
1c5f0 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69 64 78  YKEY ) pIdx->idx
1c600 54 79 70 65 20 3d 20 69 64 78 54 79 70 65 3b 0a  Type = idxType;.
1c610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
1c620 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1c630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c640 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  }..  if( !IN_REN
1c650 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 0a 20  AME_OBJECT ){.. 
1c660 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e     /* Link the n
1c670 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1c680 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1c690 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1c6a0 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  .    ** in-memor
1c6b0 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  y database struc
1c6c0 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f 0a 20  tures. .    */. 
1c6d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1c6e0 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20  e->nErr==0 );.  
1c6f0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1c700 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  usy ){.      Ind
1c710 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61 73 73  ex *p;.      ass
1c720 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49 41 4c  ert( !IN_SPECIAL
1c730 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20 20 20  _PARSE );.      
1c740 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
1c750 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
1c760 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
1c770 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
1c780 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
1c790 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
1c7a0 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
1c7b0 20 0a 20 20 20 20 20 20 20 20 20 20 70 49 6e 64   .          pInd
1c7c0 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65  ex->zName, pInde
1c7d0 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 20  x);.      if( p 
1c7e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c7f0 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
1c800 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
1c810 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
1c820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f         sqlite3Oo
1c830 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
1c840 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c850 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c860 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44    }.      db->mD
1c870 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47  bFlags |= DBFLAG
1c880 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20  _SchemaChange;. 
1c890 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d       if( pTblNam
1c8a0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
1c8b0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64  pIndex->tnum = d
1c8c0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
1c8d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c8e0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1c8f0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52  s the initial CR
1c900 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1c910 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20  ment (or CREATE 
1c920 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20 20  TABLE if the.   
1c930 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1c940 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1c950 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1c960 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1c970 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20 2a  aint) then.    *
1c980 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1c990 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1c9a0 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1c9b0 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1c9c0 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  ntry for.    ** 
1c9d0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65  the index in the
1c9e0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1c9f0 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  able and populat
1ca00 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  e the index with
1ca10 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  .    ** content.
1ca20 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f    But, do not do
1ca30 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20   this if we are 
1ca40 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74  simply reading t
1ca50 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1ca60 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f  .    ** table to
1ca70 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d   parse the schem
1ca80 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e  a, or if this in
1ca90 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d 41  dex is the PRIMA
1caa0 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 20  RY KEY index.   
1cab0 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
1cac0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
1cad0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1cae0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
1caf0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
1cb00 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
1cb10 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52  n implied PRIMAR
1cb20 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72 20  Y KEY.    ** or 
1cb30 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1cb40 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1cb50 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1cb60 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
1cb70 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1cb80 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1cb90 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1cba0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1cbb0 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  alization.    **
1cbc0 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69   step can be ski
1cbd0 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
1cbe0 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77   else if( HasRow
1cbf0 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c  id(pTab) || pTbl
1cc00 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
1cc10 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20 20   Vdbe *v;.      
1cc20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20  char *zStmt;.   
1cc30 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1cc40 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1cc50 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33       v = sqlite3
1cc60 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1cc70 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20  .      if( v==0 
1cc80 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
1cc90 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 20  te_index;..     
1cca0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1ccb0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1ccc0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20  se, 1, iDb);..  
1ccd0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1cce0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1ccf0 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1cd00 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1cd10 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
1cd20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61  doing so, code a
1cd30 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f   Noop instructio
1cd40 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20  n and store its 
1cd50 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20  address in .    
1cd60 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d 2e    ** Index.tnum.
1cd70 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
1cd80 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 69  d in case this i
1cd90 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c 79  ndex is actually
1cda0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52 49   a .      ** PRI
1cdb0 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68 65  MARY KEY and the
1cdc0 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61 6c   table is actual
1cdd0 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  ly a WITHOUT ROW
1cde0 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20 20  ID table. In .  
1cdf0 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65      ** that case
1ce00 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57 69   the convertToWi
1ce10 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28  thoutRowidTable(
1ce20 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  ) routine will r
1ce30 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a 20  eplace.      ** 
1ce40 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1ce50 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1ce60 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1ce70 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1ce80 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65 78   */.      pIndex
1ce90 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33  ->tnum = sqlite3
1cea0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
1ceb0 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71  _Noop);.      sq
1cec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ced0 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
1cee0 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42 54  e, iDb, iMem, BT
1cef0 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a 20  REE_BLOBKEY);.. 
1cf00 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74       /* Gather t
1cf10 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1cf20 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1cf30 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1cf40 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  nto.      ** the
1cf50 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a   zStmt variable.
1cf60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1cf70 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1cf80 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
1cf90 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
1cfa0 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
1cfb0 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
1cfc0 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
1cfd0 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a      if( pName->z
1cfe0 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d  [n-1]==';' ) n--
1cff0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e  ;.        /* A n
1d000 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
1d010 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
1d020 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
1d030 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53  nt */.        zS
1d040 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1d050 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1d060 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1d070 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45 72              onEr
1d080 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22  ror==OE_None ? "
1d090 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e  " : " UNIQUE", n
1d0a0 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20  , pName->z);.   
1d0b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d0c0 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1d0d0 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1d0e0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1d0f0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1d100 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20  raint */.       
1d110 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
1d120 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
1d130 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  */.        zStmt
1d140 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
1d150 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65       /* Add an e
1d160 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1d170 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1d180 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ndex.      */.  
1d190 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1d1a0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
1d1b0 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1d1c0 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c  T INTO %Q.%s VAL
1d1d0 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25  UES('index',%Q,%
1d1e0 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20  Q,#%d,%Q);",.   
1d1f0 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1d200 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41  Db].zDbSName, MA
1d210 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 20  STER_NAME,.     
1d220 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1d230 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70 54  me,.          pT
1d240 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1d250 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20       iMem,.     
1d260 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 20       zStmt.     
1d270 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
1d280 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d290 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20 2f  zStmt);..      /
1d2a0 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
1d2b0 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
1d2c0 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
1d2d0 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
1d2e0 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  pire.      ** to
1d2f0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1d300 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1d310 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20 2a  tements..      *
1d320 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c  /.      if( pTbl
1d330 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1d340 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1d350 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1d360 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1d370 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1d380 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1d390 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
1d3a0 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
1d3b0 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d3d0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1d3e0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
1d3f0 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e  pe='index'", pIn
1d400 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  dex->zName));.  
1d410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45 78  eAddOp2(v, OP_Ex
1d430 70 69 72 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  pire, 0, 1);.   
1d440 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
1d450 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1d460 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29  v, pIndex->tnum)
1d470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d480 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
1d490 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
1d4a0 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
1d4b0 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
1d4c0 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
1d4d0 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
1d4e0 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
1d4f0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
1d500 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
1d510 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
1d520 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
1d530 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
1d540 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
1d550 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
1d560 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
1d570 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
1d580 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
1d590 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
1d5a0 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
1d5b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1d5c0 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
1d5d0 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
1d5e0 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
1d5f0 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
1d600 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
1d610 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
1d620 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1d630 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
1d640 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1d650 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1d660 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
1d670 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1d680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
1d690 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
1d6a0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1d6b0 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
1d6c0 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
1d6d0 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
1d6e0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
1d6f0 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
1d700 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1d710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1d720 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
1d730 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1d740 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
1d750 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
1d760 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
1d770 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 49    }.  else if( I
1d780 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
1d790 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d7a0 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78  Parse->pNewIndex
1d7b0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 72 73  ==0 );.    pPars
1d7c0 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20 70  e->pNewIndex = p
1d7d0 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65  Index;.    pInde
1d7e0 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  x = 0;.  }..  /*
1d7f0 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65   Clean up before
1d800 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74   exiting */.exit
1d810 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20  _create_index:. 
1d820 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 73 71   if( pIndex ) sq
1d830 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64  lite3FreeIndex(d
1d840 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71  b, pIndex);.  sq
1d850 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1d860 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20  db, pPIWhere);. 
1d870 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1d880 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1d890 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
1d8a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
1d8b0 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
1d8c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
1d8d0 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  me);.}../*.** Fi
1d8e0 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52  ll the Index.aiR
1d8f0 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69  owEst[] array wi
1d900 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72  th default infor
1d910 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61  mation - informa
1d920 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73  tion.** to be us
1d930 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  ed when we have 
1d940 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c  not run the ANAL
1d950 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  YZE command..**.
1d960 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69  ** aiRowEst[0] i
1d970 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f  s supposed to co
1d980 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1d990 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
1d9a0 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
1d9b0 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
1d9c0 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
1d9d0 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
1d9e0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
1d9f0 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
1da00 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1da10 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
1da20 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1da30 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
1da40 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
1da50 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
1da60 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
1da70 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
1da80 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
1da90 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
1daa0 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
1dab0 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  nation of the fi
1dac0 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  rst 2 columns.**
1dad0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1dae0 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
1daf0 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  t must always be
1db00 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
1db10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69  .**           ai
1db20 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77  RowEst[N]<=aiRow
1db30 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20  Est[N-1].**     
1db40 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e        aiRowEst[N
1db50 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74  ]>=1.**.** Apart
1db60 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68   from that, we h
1db70 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f  ave little to go
1db80 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75   on besides intu
1db90 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68  ition as to.** h
1dba0 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68  ow aiRowEst[] sh
1dbb0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69  ould be initiali
1dbc0 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  zed.  The number
1dbd0 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65  s generated here
1dbe0 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e  .** are based on
1dbf0 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20   typical values 
1dc00 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20  found in actual 
1dc10 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64  indices..*/.void
1dc20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1dc30 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64  owEst(Index *pId
1dc40 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20  x){.  /*        
1dc50 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20          10,  9, 
1dc60 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20   8,  7,  6 */.  
1dc70 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20  LogEst aVal[] = 
1dc80 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38  { 33, 32, 30, 28
1dc90 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74  , 26 };.  LogEst
1dca0 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f   *a = pIdx->aiRo
1dcb0 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e  wLogEst;.  int n
1dcc0 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79  Copy = MIN(Array
1dcd0 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78  Size(aVal), pIdx
1dce0 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e  ->nKeyCol);.  in
1dcf0 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65 78  t i;..  /* Index
1dd00 65 73 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  es with default 
1dd10 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73 68  row estimates sh
1dd20 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73 74  ould not have st
1dd30 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61 73  at1 data */.  as
1dd40 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61 73  sert( !pIdx->has
1dd50 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20 53  Stat1 );..  /* S
1dd60 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  et the first ent
1dd70 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ry (number of ro
1dd80 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29  ws in the index)
1dd90 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65   to the estimate
1dda0 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  d .  ** number o
1ddb0 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
1ddc0 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68 65  ble, or half the
1ddd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1dde0 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  in the table.  *
1ddf0 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20  * for a partial 
1de00 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f 20  index.   But do 
1de10 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69  not let the esti
1de20 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77 20  mate drop below 
1de30 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20  10. */.  a[0] = 
1de40 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
1de50 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20  owLogEst;.  if( 
1de60 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
1de70 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d 3d  ere!=0 ) a[0] -=
1de80 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31 30   10;  assert( 10
1de90 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1dea0 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30 5d  2) );.  if( a[0]
1deb0 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b  <33 ) a[0] = 33;
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71    assert( 33==sq
1dee0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
1def0 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  );..  /* Estimat
1df00 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31  e that a[1] is 1
1df10 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b  0, a[2] is 9, a[
1df20 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73  3] is 8, a[4] is
1df30 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a   7, a[5] is.  **
1df40 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73   6 and each subs
1df50 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66  equent value (if
1df60 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a   any) is 5.  */.
1df70 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20    memcpy(&a[1], 
1df80 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65  aVal, nCopy*size
1df90 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66  of(LogEst));.  f
1dfa0 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c  or(i=nCopy+1; i<
1dfb0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  =pIdx->nKeyCol; 
1dfc0 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i++){.    a[i] =
1dfd0 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   23;            
1dfe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dff0 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  23==sqlite3LogEs
1e000 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61  t(5) );.  }..  a
1e010 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
1e020 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20  3LogEst(1) );.  
1e030 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  if( IsUniqueInde
1e040 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64 78  x(pIdx) ) a[pIdx
1e050 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b 0a  ->nKeyCol] = 0;.
1e060 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e070 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
1e080 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
1e090 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
1e0a0 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
1e0b0 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
1e0c0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
1e0d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
1e0e0 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
1e0f0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1e100 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
1e110 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
1e120 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
1e130 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1e140 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1e150 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65  int iDb;..  asse
1e160 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1e170 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65  ==0 );   /* Neve
1e180 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
1e190 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
1e1a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1e1b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1e1c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e1d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1e1e0 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
1e1f0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1e200 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1e210 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1e220 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1e230 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1e240 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
1e250 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e  FindIndex(db, pN
1e260 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
1e270 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
1e280 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1e290 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Index==0 ){.    
1e2a0 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b  if( !ifExists ){
1e2b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
1e2c0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e2d0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
1e2e0 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20  S", pName, 0);. 
1e2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e300 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1e310 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
1e320 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
1e330 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
1e340 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
1e350 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
1e360 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1e370 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1e380 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78 54  if( pIndex->idxT
1e390 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54  ype!=SQLITE_IDXT
1e3a0 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20 20  YPE_APPDEF ){.  
1e3b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e3c0 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
1e3d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e3e0 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20   UNIQUE ".      
1e3f0 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20  "or PRIMARY KEY 
1e400 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f  constraint canno
1e410 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30  t be dropped", 0
1e420 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
1e430 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1e440 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1e450 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
1e460 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
1e470 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  a);.#ifndef SQLI
1e480 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1e490 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
1e4a0 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  t code = SQLITE_
1e4b0 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  DROP_INDEX;.    
1e4c0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
1e4d0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20  ndex->pTable;.  
1e4e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1e4f0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
1e500 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63  .zDbSName;.    c
1e510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1e520 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1e530 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1e540 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e550 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1e560 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1e570 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1e580 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1e590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e5a0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1e5b0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1e5c0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1e5d0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1e5e0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e5f0 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1e600 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1e610 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1e620 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1e630 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1e640 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1e650 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1e660 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1e670 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1e680 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1e690 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1e6a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1e6b0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1e6c0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1e6d0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1e6e0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1e6f0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1e700 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1e710 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1e720 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1e730 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1e740 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1e750 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
1e760 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  e, MASTER_NAME, 
1e770 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
1e780 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1e790 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
1e7a0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64  pParse, iDb, "id
1e7b0 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  x", pIndex->zNam
1e7c0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  e);.    sqlite3C
1e7d0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
1e7e0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65  se, iDb);.    de
1e7f0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
1e800 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
1e810 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
1e820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e830 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
1e840 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64   iDb, 0, 0, pInd
1e850 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
1e860 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
1e870 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
1e880 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1e890 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
1e8a0 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69   pArray is a poi
1e8b0 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
1e8c0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63   of objects. Eac
1e8d0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a  h object in the.
1e8e0 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e  ** array is szEn
1e8f0 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  try bytes in siz
1e900 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
1e910 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65  uses sqlite3DbRe
1e920 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78  alloc().** to ex
1e930 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73  tend the array s
1e940 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
1e950 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20  space for a new 
1e960 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e  object at the en
1e970 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  d..**.** When th
1e980 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e990 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  alled, *pnEntry 
1e9a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72  contains the cur
1e9b0 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20  rent size of.** 
1e9c0 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e  the array (in en
1e9d0 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61  tries - so the a
1e9e0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a  llocation is ((*
1e9f0 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74  pnEntry) * szEnt
1ea00 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20  ry) bytes.** in 
1ea10 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  total)..**.** If
1ea20 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69   the realloc() i
1ea30 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e  s successful (i.
1ea40 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e  e. if no OOM con
1ea50 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20  dition occurs), 
1ea60 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c  the.** space all
1ea70 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e  ocated for the n
1ea80 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72  ew object is zer
1ea90 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70  oed, *pnEntry up
1eaa0 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c  dated to.** refl
1eab0 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65  ect the new size
1eac0 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e   of the array an
1ead0 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
1eae0 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
1eaf0 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a  n.** returned. *
1eb00 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  pIdx is set to t
1eb10 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
1eb20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20  new array entry 
1eb30 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
1eb40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1eb50 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1eb60 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20  fails, *pIdx is 
1eb70 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e  set to -1, *pnEn
1eb80 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75  try remains.** u
1eb90 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63  nchanged and a c
1eba0 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65  opy of pArray re
1ebb0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  turned..*/.void 
1ebc0 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c  *sqlite3ArrayAll
1ebd0 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  ocate(.  sqlite3
1ebe0 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f   *db,      /* Co
1ebf0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1ec00 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1ec10 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  lures */.  void 
1ec20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20  *pArray,     /* 
1ec30 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73  Array of objects
1ec40 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c  .  Might be real
1ec50 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
1ec60 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f   szEntry,      /
1ec70 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f  * Size of each o
1ec80 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72  bject in the arr
1ec90 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  ay */.  int *pnE
1eca0 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d  ntry,     /* Num
1ecb0 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63  ber of objects c
1ecc0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1ecd0 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20  */.  int *pIdx  
1ece0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ecf0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e  the index of a n
1ed00 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a  ew slot here */.
1ed10 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
1ed20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79  int n = *pnEntry
1ed30 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d  ;.  if( (n & (n-
1ed40 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  1))==0 ){.    in
1ed50 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20  t sz = (n==0) ? 
1ed60 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69  1 : 2*n;.    voi
1ed70 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  d *pNew = sqlite
1ed80 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1ed90 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72  Array, sz*szEntr
1eda0 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  y);.    if( pNew
1edb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49  ==0 ){.      *pI
1edc0 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  dx = -1;.      r
1edd0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20  eturn pArray;.  
1ede0 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d    }.    pArray =
1edf0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
1ee00 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
1ee10 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20    memset(&z[n * 
1ee20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45  szEntry], 0, szE
1ee30 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ntry);.  *pIdx =
1ee40 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79   n;.  ++*pnEntry
1ee50 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
1ee60 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
1ee70 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
1ee80 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
1ee90 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
1eea0 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
1eeb0 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
1eec0 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
1eed0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1eee0 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
1eef0 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
1ef00 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
1ef10 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  end(Parse *pPars
1ef20 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  e, IdList *pList
1ef30 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
1ef40 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1ef50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1ef60 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ef70 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1ef80 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1ef90 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1efa0 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
1efb0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1efc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1efd0 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
1efe0 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1eff0 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
1f000 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
1f010 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
1f020 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
1f030 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
1f040 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
1f050 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
1f060 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1f070 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1f080 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1f090 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f0a0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f0b0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
1f0c0 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  n);.  if( IN_REN
1f0d0 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c  AME_OBJECT && pL
1f0e0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1f0f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1f100 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
1f110 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73  rse, (void*)pLis
1f120 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
1f130 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  Token);.  }.  re
1f140 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1f150 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
1f160 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
1f170 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1f180 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1f190 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
1f1a0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1f1b0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1f1c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f1d0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
1f1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1f1f0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
1f200 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
1f210 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1f220 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
1f230 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
1f240 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1f250 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f260 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1f270 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1f280 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1f290 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1f2a0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1f2b0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1f2c0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1f2d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1f2e0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1f2f0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1f300 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1f310 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1f320 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1f330 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1f340 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1f350 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1f360 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1f370 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1f380 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1f390 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1f3a0 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1f3b0 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1f3c0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1f3d0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1f3e0 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1f3f0 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1f400 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1f410 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1f420 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1f430 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1f440 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1f450 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1f460 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1f470 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1f480 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1f490 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1f4a0 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1f4b0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1f4c0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1f4d0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1f4e0 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1f4f0 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1f500 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1f510 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1f520 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1f530 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1f540 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1f550 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1f560 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1f570 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1f580 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1f590 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1f5a0 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1f5b0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1f5c0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1f5d0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1f5e0 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1f5f0 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1f600 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1f610 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1f620 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1f630 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1f640 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1f650 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1f660 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1f670 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1f680 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1f690 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f6a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1f6b0 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1f6c0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1f6d0 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1f6e0 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1f6f0 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1f700 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1f710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f720 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1f730 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1f740 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1f750 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1f760 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1f770 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1f780 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1f790 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1f7a0 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1f7b0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1f7c0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1f7d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1f7e0 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1f7f0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1f800 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1f810 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1f820 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1f830 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1f840 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1f850 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1f860 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1f870 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1f880 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1f890 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1f8a0 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74 72 61  c->nSrc*2+nExtra
1f8b0 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1f8c0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1f8d0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1f8e0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1f8f0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1f900 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1f910 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1f920 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1f930 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1f940 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1f950 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1f960 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1f970 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1f980 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1f990 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1f9a0 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1f9b0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1f9c0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1f9d0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1f9e0 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20  nAlloc = nGot;. 
1f9f0 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
1fa00 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
1fa10 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
1fa20 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
1fa30 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
1fa40 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
1fa50 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
1fa60 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
1fa70 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
1fa80 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
1fa90 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
1faa0 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74  rc->nSrc += nExt
1fab0 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ra;..  /* Zero t
1fac0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
1fad0 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65  ed slots */.  me
1fae0 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53  mset(&pSrc->a[iS
1faf0 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  tart], 0, sizeof
1fb00 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78  (pSrc->a[0])*nEx
1fb10 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53  tra);.  for(i=iS
1fb20 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e  tart; i<iStart+n
1fb30 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20  Extra; i++){.   
1fb40 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
1fb50 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  sor = -1;.  }.. 
1fb60 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69   /* Return a poi
1fb70 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61  nter to the enla
1fb80 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a  rged SrcList */.
1fb90 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d    return pSrc;.}
1fba0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
1fbb0 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  a new table name
1fbc0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72   to the given Sr
1fbd0 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  cList.  Create a
1fbe0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a   new SrcList if.
1fbf0 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e  ** need be.  A n
1fc00 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65 61  ew entry is crea
1fc10 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69  ted in the SrcLi
1fc20 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c  st even if pTabl
1fc30 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  e is NULL..**.**
1fc40 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72 65   A SrcList is re
1fc50 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1fc60 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  if there is an O
1fc70 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72  OM error.  The r
1fc80 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69  eturned.** SrcLi
1fc90 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  st might be the 
1fca0 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c  same as the SrcL
1fcb0 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e 70  ist that was inp
1fcc0 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  ut or it might b
1fcd0 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20  e.** a new one. 
1fce0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1fcf0 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68   does occurs, th
1fd00 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c  en the prior val
1fd10 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74  ue of pList.** t
1fd20 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20  hat is input to 
1fd30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1fd40 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72  automatically fr
1fd50 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  eed..**.** If pD
1fd60 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e  atabase is not n
1fd70 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ull, it means th
1fd80 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  at the table has
1fd90 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20   an optional.** 
1fda0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72  database name pr
1fdb0 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73  efix.  Like this
1fdc0 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61 62  :  "database.tab
1fdd0 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61 62  le".  The pDatab
1fde0 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ase.** points to
1fdf0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1fe00 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20 70  and the pTable p
1fe10 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74  oints to the dat
1fe20 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54  abase name..** T
1fe30 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a  he SrcList.a[].z
1fe40 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69  Name field is fi
1fe50 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 61  lled with the ta
1fe60 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d  ble name which m
1fe70 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f  ight.** come fro
1fe80 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44 61  m pTable (if pDa
1fe90 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20  tabase is NULL) 
1fea0 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73  or from pDatabas
1feb0 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e  e.  .** SrcList.
1fec0 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73  a[].zDatabase is
1fed0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1fee0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66   database name f
1fef0 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f  rom pTable,.** o
1ff00 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e  r with NULL if n
1ff10 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73 70  o database is sp
1ff20 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ecified..**.** I
1ff30 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1ff40 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73  f call like this
1ff50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ff60 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ff70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a  pend(D,A,B,0);.*
1ff80 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61  *.** Then B is a
1ff90 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
1ffa0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1ffb0 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65 64  e is unspecified
1ffc0 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20  .  If called.** 
1ffd0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1ffe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fff0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
20000 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,C);.**.** Th
20010 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62 6c  en C is the tabl
20020 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20  e name and B is 
20030 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
20040 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66 69  e.  If C is defi
20050 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69  ned.** then so i
20060 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s B.  In other w
20070 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68  ords, we never h
20080 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72 65  ave a case where
20090 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
200a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
200b0 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a  pend(D,A,0,C);.*
200c0 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65  *.** Both pTable
200d0 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20 61   and pDatabase a
200e0 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  re assumed to be
200f0 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61   quoted.  They a
20100 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62  re dequoted.** b
20110 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65  efore being adde
20120 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  d to the SrcList
20130 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
20140 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
20150 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nd(.  sqlite3 *d
20160 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  b,        /* Con
20170 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
20180 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
20190 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  ures */.  SrcLis
201a0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
201b0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
201c0 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
201d0 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
201e0 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
201f0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
20200 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
20210 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
20220 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
20230 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
20240 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
20250 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20260 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  Item;.  assert( 
20270 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20  pDatabase==0 || 
20280 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a  pTable!=0 );  /*
20290 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77   Cannot have C w
202a0 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73  ithout B */.  as
202b0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
202c0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
202d0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
202e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
202f0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63  N(db, sizeof(Src
20300 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
20310 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
20320 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rn 0;.    pList-
20330 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20  >nAlloc = 1;.   
20340 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31   pList->nSrc = 1
20350 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4c  ;.    memset(&pL
20360 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69  ist->a[0], 0, si
20370 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
20380 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ));.    pList->a
20390 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
203a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
203b0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
203c0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
203d0 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
203e0 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20 20 69  ->nSrc);.  }.  i
203f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
20400 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
20410 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
20420 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
20430 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
20440 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
20450 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d  a[pList->nSrc-1]
20460 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  ;.  if( pDatabas
20470 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  e && pDatabase->
20480 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74  z==0 ){.    pDat
20490 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
204a0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29   if( pDatabase )
204b0 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  {.    pItem->zNa
204c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
204d0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
204e0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 49  atabase);.    pI
204f0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
20500 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
20510 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
20520 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20530 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
20540 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20550 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
20560 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
20570 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  abase = 0;.  }. 
20580 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
20590 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
205a0 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
205b0 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
205c0 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
205d0 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
205e0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
205f0 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
20600 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
20610 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
20620 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20630 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
20640 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
20650 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
20660 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
20670 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
20680 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
20690 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
206a0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
206b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
206c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
206d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
206e0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
206f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
20700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
20710 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
20720 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
20730 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
20740 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
20750 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
20760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20770 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
20780 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
20790 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
207a0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
207b0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
207c0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
207d0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
207e0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
207f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
20800 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20810 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
20820 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
20830 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
20840 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
20850 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
20860 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
20870 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20880 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
20890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
208a0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
208b0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
208c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
208d0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
208e0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
208f0 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71 6c  sIndexedBy ) sql
20900 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20910 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
20920 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  dBy);.    if( pI
20930 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
20940 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  c ) sqlite3ExprL
20950 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
20960 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
20970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
20980 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
20990 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
209a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
209b0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
209c0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
209d0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
209e0 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
209f0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
20a00 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
20a10 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
20a20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
20a30 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
20a40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20a50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
20a60 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
20a70 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
20a80 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
20a90 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
20aa0 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
20ab0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
20ac0 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
20ad0 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
20ae0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20af0 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
20b00 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
20b10 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
20b20 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
20b30 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
20b40 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
20b50 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
20b60 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
20b70 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
20b80 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
20b90 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
20ba0 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
20bb0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
20bc0 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
20bd0 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
20be0 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
20bf0 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
20c00 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70  an alias, then p
20c10 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
20c20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
20c30 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
20c40 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
20c50 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
20c60 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
20c70 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
20c80 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
20c90 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
20ca0 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
20cb0 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
20cc0 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
20cd0 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
20ce0 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
20cf0 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
20d00 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
20d10 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
20d20 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
20d30 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
20d40 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
20d50 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
20d60 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
20d70 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
20d80 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
20d90 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
20da0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
20dc0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20dd0 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
20de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20df0 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
20e00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
20e10 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
20e20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
20e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
20e40 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
20e50 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
20e60 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
20e70 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
20e80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20e90 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
20ea0 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
20eb0 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
20ec0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
20ed0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
20ee0 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
20ef0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
20f00 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
20f10 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
20f20 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
20f30 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
20f40 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 4f 6e  me */.  const On
20f50 55 73 69 6e 67 20 2a 70 4f 6e 55 73 69 6e 67 20  Using *pOnUsing 
20f60 2f 2a 20 54 68 65 20 4f 4e 20 6f 72 20 55 53 49  /* The ON or USI
20f70 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b 0a  NG clause */.){.
20f80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20f90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
20fa0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20fb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
20fc0 72 74 28 20 70 4f 6e 55 73 69 6e 67 21 3d 30 20  rt( pOnUsing!=0 
20fd0 29 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  );.  if( !p && (
20fe0 70 4f 6e 55 73 69 6e 67 2d 3e 70 4f 6e 20 7c 7c  pOnUsing->pOn ||
20ff0 20 70 4f 6e 55 73 69 6e 67 2d 3e 70 55 73 69 6e   pOnUsing->pUsin
21000 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  g) ){.    sqlite
21010 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
21020 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65  , "a JOIN clause
21030 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66   is required bef
21040 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20  ore %s", .      
21050 28 70 4f 6e 55 73 69 6e 67 2d 3e 70 4f 6e 20 3f  (pOnUsing->pOn ?
21060 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29   "ON" : "USING")
21070 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f  .    );.    goto
21080 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
21090 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  or;.  }.  p = sq
210a0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
210b0 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65  nd(db, p, pTable
210c0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
210d0 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
210e0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
210f0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73  _error;.  }.  as
21100 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
21110 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d  );.  pItem = &p-
21120 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
21130 20 61 73 73 65 72 74 28 20 28 70 54 61 62 6c 65   assert( (pTable
21140 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65  ==0)==(pDatabase
21150 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
21160 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
21170 30 20 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d  0 || pDatabase!=
21180 30 20 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  0 );.  if( IN_RE
21190 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
211a0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
211b0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e     Token *pToken
211c0 20 3d 20 28 41 4c 57 41 59 53 28 70 44 61 74 61   = (ALWAYS(pData
211d0 62 61 73 65 29 20 26 26 20 70 44 61 74 61 62 61  base) && pDataba
211e0 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61  se->z) ? pDataba
211f0 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20  se : pTable;.   
21200 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
21210 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70  kenMap(pParse, p
21220 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f  Item->zName, pTo
21230 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ken);.  }.  asse
21240 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b  rt( pAlias!=0 );
21250 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e  .  if( pAlias->n
21260 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
21270 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
21280 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
21290 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
212a0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
212b0 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
212c0 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 55 73  tem->pOn = pOnUs
212d0 69 6e 67 2d 3e 70 4f 6e 3b 0a 20 20 70 49 74 65  ing->pOn;.  pIte
212e0 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 4f 6e 55  m->pUsing = pOnU
212f0 73 69 6e 67 2d 3e 70 55 73 69 6e 67 3b 0a 20 20  sing->pUsing;.  
21300 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65  return p;.. appe
21310 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20  nd_from_error:. 
21320 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b   assert( p==0 );
21330 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
21340 6c 65 74 65 28 64 62 2c 20 70 4f 6e 55 73 69 6e  lete(db, pOnUsin
21350 67 2d 3e 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  g->pOn);.  sqlit
21360 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
21370 62 2c 20 70 4f 6e 55 73 69 6e 67 2d 3e 70 55 73  b, pOnUsing->pUs
21380 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ing);.  sqlite3S
21390 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
213a0 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65  pSubquery);.  re
213b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
213c0 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20   Add an INDEXED 
213d0 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
213e0 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  D clause to the 
213f0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
21400 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  ded .** element 
21410 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  of the source-li
21420 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
21430 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21440 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21450 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
21460 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
21470 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b   SrcList *p, Tok
21480 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b  en *pIndexedBy){
21490 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65  .  assert( pInde
214a0 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  xedBy!=0 );.  if
214b0 28 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42  ( p && pIndexedB
214c0 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74  y->n>0 ){.    st
214d0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
214e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
214f0 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
21500 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26  );.    pItem = &
21510 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
21520 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
21530 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
21540 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
21550 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
21560 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
21570 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
21580 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
21590 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
215a0 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
215b0 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
215c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
215d0 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
215e0 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
215f0 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
21600 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
21610 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
21620 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
21630 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
21640 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
21650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21660 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
21670 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e  xedBy = sqlite3N
21680 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
21690 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
216a0 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65  dBy);.      pIte
216b0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
216c0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = 1;.    }.  }
216d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
216e0 65 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  e list of functi
216f0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
21700 74 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72  the SrcList entr
21710 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  y for a.** table
21720 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
21730 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21740 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73  3SrcListFuncArgs
21750 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21760 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72  SrcList *p, Expr
21770 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
21780 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
21790 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
217a0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
217b0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
217c0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
217d0 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  g.notIndexed==0 
217e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
217f0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
21800 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  edBy==0 );.    a
21810 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21820 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b  .isTabFunc==0 );
21830 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70  .    pItem->u1.p
21840 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b  FuncArg = pList;
21850 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69  .    pItem->fg.i
21860 73 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20  sTabFunc = 1;.  
21870 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
21880 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
21890 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
218a0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
218b0 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
218c0 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
218d0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
218e0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
218f0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
21900 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
21910 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
21920 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
21930 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
21940 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
21950 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
21960 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
21970 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
21980 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
21990 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
219a0 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
219b0 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
219c0 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
219d0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
219e0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
219f0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
21a00 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
21a10 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
21a20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
21a30 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
21a40 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
21a50 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
21a60 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
21a70 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
21a80 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
21a90 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
21aa0 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
21ab0 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
21ac0 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
21ad0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
21ae0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
21af0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
21b00 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
21b10 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
21b20 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
21b30 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
21b40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
21b50 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
21b60 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
21b70 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  fg.jointype = p-
21b80 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74  >a[i-1].fg.joint
21b90 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
21ba0 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[0].fg.jointy
21bb0 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
21bc0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
21bd0 42 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  BE code for a BE
21be0 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  GIN statement..*
21bf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
21c00 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
21c10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21c20 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
21c30 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
21c40 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
21c50 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
21c60 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
21c70 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
21c80 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
21c90 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21ca0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
21cb0 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45  TRANSACTION, "BE
21cc0 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  GIN", 0, 0) ){. 
21cd0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
21ce0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
21cf0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
21d00 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a  f( !v ) return;.
21d10 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44    if( type!=TK_D
21d20 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66  EFERRED ){.    f
21d30 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
21d40 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  b; i++){.      s
21d50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21d60 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  (v, OP_Transacti
21d70 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b  on, i, (type==TK
21d80 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a  _EXCLUSIVE)+1);.
21d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21da0 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29  eUsesBtree(v, i)
21db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
21dc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
21dd0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
21de0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
21df0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66  rate VDBE code f
21e00 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52  or a COMMIT or R
21e10 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e  OLLBACK statemen
21e20 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52  t..** Code for R
21e30 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72  OLLBACK is gener
21e40 61 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54  ated if eType==T
21e50 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68  K_ROLLBACK.  Oth
21e60 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69  erwise.** code i
21e70 73 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  s generated for 
21e80 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69  a COMMIT..*/.voi
21e90 64 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e  d sqlite3EndTran
21ea0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
21eb0 50 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65  Parse, int eType
21ec0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
21ed0 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a  int isRollback;.
21ee0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
21ef0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
21f00 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
21f10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  );.  assert( eTy
21f20 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c  pe==TK_COMMIT ||
21f30 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c   eType==TK_END |
21f40 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c  | eType==TK_ROLL
21f50 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c  BACK );.  isRoll
21f60 62 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b  back = eType==TK
21f70 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28  _ROLLBACK;.  if(
21f80 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
21f90 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
21fa0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20  _TRANSACTION, . 
21fb0 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b        isRollback
21fc0 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20   ? "ROLLBACK" : 
21fd0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
21fe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
21ff0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
22000 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
22010 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
22020 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22030 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
22040 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63  it, 1, isRollbac
22050 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
22060 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22070 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
22080 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70  parser when it p
22090 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20  arses a command 
220a0 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65  to create,.** re
220b0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
220c0 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69  k an SQL savepoi
220d0 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nt. .*/.void sql
220e0 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61  ite3Savepoint(Pa
220f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
22100 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d   op, Token *pNam
22110 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  e){.  char *zNam
22120 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
22130 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
22140 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  >db, pName);.  i
22150 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
22160 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
22170 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
22180 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
22190 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
221a0 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63  ION.    static c
221b0 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
221c0 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49  t az[] = { "BEGI
221d0 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
221e0 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
221f0 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
22200 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
22210 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
22220 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
22230 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
22240 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
22250 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
22260 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
22270 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
22280 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
22290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
222a0 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
222b0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
222c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
222d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
222e0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
222f0 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
22300 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
22310 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
22320 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
22330 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
22340 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
22350 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
22360 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
22370 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
22380 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
22390 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
223a0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
223b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
223c0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
223d0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
223e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
223f0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
22400 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
22410 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
22420 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
22430 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20  t rc;.    Btree 
22440 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63  *pBt;.    static
22450 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
22460 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
22470 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22480 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
22490 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
224a0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
224b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
224c0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
224d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
224e0 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
224f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22500 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
22510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22520 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
22530 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c   0, db, &pBt, 0,
22540 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
22550 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22560 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
22570 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
22580 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
22590 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
225a0 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
225b0 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
225c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
225d0 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
225e0 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
225f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
22600 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d  }.    db->aDb[1]
22610 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  .pBt = pBt;.    
22620 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
22630 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
22640 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d    if( SQLITE_NOM
22650 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  EM==sqlite3Btree
22660 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c  SetPageSize(pBt,
22670 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
22680 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20  e, -1, 0) ){.   
22690 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
226a0 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65  lt(db);.      re
226b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
226c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
226d0 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
226e0 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
226f0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69  schema cookie wi
22700 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65  ll need to be ve
22710 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61  rified.** for da
22720 74 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65  tabase iDb.  The
22730 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c   code to actuall
22740 79 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  y verify the sch
22750 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69  ema cookie.** wi
22760 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ll occur at the 
22770 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c  end of the top-l
22780 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69  evel VDBE and wi
22790 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a  ll be generated.
227a0 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c  ** later, by sql
227b0 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
227c0 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
227d0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
227e0 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
227f0 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  e, int iDb){.  P
22800 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
22810 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
22820 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
22830 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
22840 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
22850 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
22860 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
22870 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d  ->aDb[iDb].pBt!=
22880 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20  0 || iDb==1 );. 
22890 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
228a0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
228b0 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +2 );.  assert( 
228c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
228d0 65 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64  exHeld(pParse->d
228e0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
228f0 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70  if( DbMaskTest(p
22900 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
22910 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b  Mask, iDb)==0 ){
22920 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
22930 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
22940 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20  Mask, iDb);.    
22950 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
22960 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20   && iDb==1 ){.  
22970 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
22980 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70  empDatabase(pTop
22990 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  level);.    }.  
229a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
229b0 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
229c0 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
229d0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
229e0 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
229f0 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
22a00 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
22a10 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
22a20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
22a30 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
22a40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
22a50 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
22a60 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
22a70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
22a80 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
22a90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
22aa0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
22ab0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
22ac0 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
22ad0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
22ae0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
22af0 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
22b00 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
22b10 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  Db, pDb->zDbSNam
22b20 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e)) ){.      sql
22b30 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
22b40 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b  hema(pParse, i);
22b50 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
22b60 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
22b70 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
22b80 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
22b90 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
22ba0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
22bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
22bc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22bd0 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
22be0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
22bf0 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
22c00 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
22c10 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
22c20 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
22c30 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
22c40 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
22c50 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
22c60 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
22c70 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
22c80 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
22c90 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
22ca0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
22cb0 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
22cc0 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
22cd0 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
22ce0 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
22cf0 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
22d00 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
22d10 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
22d20 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
22d30 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
22d40 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
22d50 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
22d60 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
22d70 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
22d80 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
22d90 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
22da0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
22db0 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
22dc0 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
22dd0 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
22de0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
22df0 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
22e00 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
22e10 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
22e20 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
22e30 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
22e40 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
22e50 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
22e60 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
22e70 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
22e80 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
22e90 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
22ea0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
22eb0 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c   DbMaskSet(pTopl
22ec0 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  evel->writeMask,
22ed0 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76   iDb);.  pToplev
22ee0 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
22ef0 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74   |= setStatement
22f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  ;.}../*.** Indic
22f10 61 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ate that the sta
22f20 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  tement currently
22f30 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
22f40 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a  ion might write.
22f50 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ** more than one
22f60 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a   entry (example:
22f70 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f   deleting one ro
22f80 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  w then inserting
22f90 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73   another,.** ins
22fa0 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  erting multiple 
22fb0 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c  rows in a table,
22fc0 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20   or inserting a 
22fd0 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  row and index en
22fe0 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e  tries.).** If an
22ff0 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66   abort occurs af
23000 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73  ter some of thes
23010 65 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f  e writes have co
23020 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74  mpleted, then it
23030 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65   will.** be nece
23040 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68  ssary to undo th
23050 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74  e completed writ
23060 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
23070 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61  te3MultiWrite(Pa
23080 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23090 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
230a0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
230b0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
230c0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
230d0 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a  MultiWrite = 1;.
230e0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  }../* .** The co
230f0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c  de generator cal
23100 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
23110 69 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20  if is discovers 
23120 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f  that it is.** po
23130 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20  ssible to abort 
23140 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f  a statement prio
23150 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  r to completion.
23160 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a    In order to .*
23170 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61  * perform this a
23180 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72  bort without cor
23190 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61  rupting the data
231a0 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  base, we need to
231b0 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68   make.** sure th
231c0 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
231d0 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
231e0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
231f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23200 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20  Technically, we 
23210 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74  only need to set
23220 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c   the mayAbort fl
23230 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d  ag if the.** isM
23240 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77  ultiWrite flag w
23250 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
23260 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74  t.  There is a t
23270 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
23280 2a 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  * such that the 
23290 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72  abort must occur
232a0 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69   after the multi
232b0 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b  write.  This mak
232c0 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65  es.** some state
232d0 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20  ments involving 
232e0 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66  the REPLACE conf
232f0 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
23300 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20  algorithm.** go 
23310 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e  a little faster.
23320 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76    But taking adv
23330 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74  antage of this t
23340 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a  ime dependency.*
23350 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20  * makes it more 
23360 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f  difficult to pro
23370 76 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  ve that the code
23380 20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20   is correct (in 
23390 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20  .** particular, 
233a0 69 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  it prevents us f
233b0 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65  rom writing an e
233c0 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c  ffective.** impl
233d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71  ementation of sq
233e0 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
233f0 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65  ort()) and so we
23400 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20   have chosen.** 
23410 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65  to take the safe
23420 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20   route and skip 
23430 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
23440 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23450 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20  3MayAbort(Parse 
23460 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73  *pParse){.  Pars
23470 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
23480 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
23490 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70  vel(pParse);.  p
234a0 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f  Toplevel->mayAbo
234b0 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt = 1;.}../*.**
234c0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
234d0 20 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65   that causes the
234e0 20 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20   vdbe to return 
234f0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  an SQLITE_CONSTR
23500 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54  AINT.** error. T
23510 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d  he onError param
23520 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20  eter determines 
23530 77 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f  which (if any) o
23540 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  f the statement.
23550 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e  ** and/or curren
23560 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
23570 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
23580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c  .void sqlite3Hal
23590 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  tConstraint(.  P
235a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
235b0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
235c0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ext */.  int err
235d0 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78  Code,      /* ex
235e0 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64  tended error cod
235f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  e */.  int onErr
23600 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
23610 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
23620 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20   char *p4,      
23630 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
23640 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79  age */.  i8 p4ty
23650 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34  pe,        /* P4
23660 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52  _STATIC or P4_TR
23670 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20  ANSIENT */.  u8 
23680 70 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f  p5Errmsg       /
23690 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65  * P5_ErrMsg type
236a0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
236b0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
236c0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
236d0 65 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78  ert( (errCode&0x
236e0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
236f0 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20  TRAINT );.  if( 
23700 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72  onError==OE_Abor
23710 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23720 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
23730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
23740 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
23750 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f  Halt, errCode, o
23760 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70  nError, 0, p4, p
23770 34 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65  4type);.  sqlite
23780 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
23790 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f   p5Errmsg);.}../
237a0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
237b0 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51  Halt due to UNIQ
237c0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
237d0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  Y constraint vio
237e0 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  lation..*/.void 
237f0 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
23800 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
23810 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
23820 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
23830 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
23840 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
23850 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49  aint type */.  I
23860 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20  ndex *pIdx      
23870 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68   /* The index th
23880 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20  at triggers the 
23890 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b  constraint */.){
238a0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  .  char *zErr;. 
238b0 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63   int j;.  StrAcc
238c0 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62  um errMsg;.  Tab
238d0 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d  le *pTab = pIdx-
238e0 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69  >pTable;..  sqli
238f0 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28  te3StrAccumInit(
23900 26 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d  &errMsg, pParse-
23910 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b  >db, 0, 0, 200);
23920 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f  .  if( pIdx->aCo
23930 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  lExpr ){.    sql
23940 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
23950 28 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78  (&errMsg, "index
23960 20 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e   '%q'", pIdx->zN
23970 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
23980 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
23990 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
239a0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
239b0 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Col;.      asser
239c0 74 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  t( pIdx->aiColum
239d0 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  n[j]>=0 );.     
239e0 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
239f0 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
23a00 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  n[j]].zName;.   
23a10 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
23a20 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65  e3_str_append(&e
23a30 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
23a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
23a50 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72  tr_appendall(&er
23a60 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  rMsg, pTab->zNam
23a70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
23a80 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
23a90 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20  rMsg, ".", 1);. 
23aa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
23ab0 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d  _appendall(&errM
23ac0 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  sg, zCol);.    }
23ad0 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
23ae0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
23af0 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
23b00 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
23b10 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
23b20 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
23b30 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
23b40 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
23b50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
23b80 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
23b90 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
23ba0 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
23bb0 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
23bc0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
23bd0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
23be0 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
23bf0 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
23c00 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
23c10 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
23c20 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
23c30 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
23c40 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
23c50 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
23c60 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
23c70 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
23c80 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
23c90 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
23ca0 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
23cb0 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
23cc0 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
23cd0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
23ce0 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
23cf0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
23d00 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
23d10 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
23d20 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
23d50 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
23d60 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
23d70 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
23d80 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
23d90 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
23da0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
23db0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
23dc0 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
23dd0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
23de0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
23df0 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
23e00 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
23e10 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
23e20 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
23e30 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
23e60 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
23e70 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23e80 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
23e90 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23ea0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
23eb0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
23ec0 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
23ed0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
23ee0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
23ef0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
23f00 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
23f10 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
23f20 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
23f30 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
23f40 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
23f50 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
23f60 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
23f70 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
23f80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23f90 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
23fa0 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
23fb0 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
23fc0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
23fd0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
23fe0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
23ff0 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
24000 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
24010 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24020 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
24030 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
24040 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
24050 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
24060 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
24070 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
24080 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
24090 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
240a0 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
240b0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
240c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
240d0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
240e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
240f0 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
24100 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
24110 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
24120 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
24130 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
24140 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
24150 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
24160 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
24170 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
24180 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
24190 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
241a0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
241b0 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
241c0 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
241d0 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
241e0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
241f0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
24200 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
24210 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
24220 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
24230 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
24240 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
24250 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
24260 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
24270 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
24280 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
24290 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
242a0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
242b0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
242c0 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
242d0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
242e0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
242f0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
24300 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
24310 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
24320 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
24330 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
24340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24350 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
24360 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
24370 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
24380 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
24390 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
243a0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
243b0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
243c0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
243d0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
243f0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
24400 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
24410 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24420 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
24430 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
24440 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
24450 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
24460 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
24470 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
24480 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
24490 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
244a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
244b0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
244c0 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
244d0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
244e0 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
244f0 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
24500 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
24510 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
24520 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
24530 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
24540 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
24550 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
24560 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
24570 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
24580 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
24590 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
245a0 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
245b0 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
245c0 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
245d0 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
245e0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
245f0 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
24600 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
24610 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
24620 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
24630 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
24640 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
24650 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
24680 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
24690 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
246a0 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
246b0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
246c0 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
246d0 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
246e0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
246f0 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
24700 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
24710 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
24720 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
24730 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
24740 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
24750 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
24760 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
24770 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
24780 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
24790 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
247a0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
247b0 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
247c0 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
247d0 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
247e0 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
247f0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
24800 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
24810 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24820 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
24830 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
24840 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
24850 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
24860 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
24870 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
24880 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
24890 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
248a0 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
248b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
248c0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
248d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
248e0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
248f0 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
24900 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
24910 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
24920 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
24930 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24950 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
24960 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
24970 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
24980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
24990 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
249a0 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
249b0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
249c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
249d0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
249e0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
249f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24a00 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
24a10 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24a20 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
24a30 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
24a40 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
24a50 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
24a60 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
24a70 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
24a80 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
24a90 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
24aa0 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
24ab0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
24ac0 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
24ad0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
24ae0 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
24af0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
24b00 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
24b10 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
24b20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
24b30 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
24b40 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
24b50 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
24b60 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
24b70 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
24b80 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
24b90 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
24ba0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
24bb0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
24bc0 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
24bd0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
24be0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
24bf0 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
24c00 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
24c10 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
24c20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
24c30 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
24c40 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
24c50 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
24c60 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
24c70 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
24c80 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
24c90 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
24ca0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
24cb0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
24cc0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
24cd0 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
24ce0 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
24cf0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
24d00 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
24d10 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
24d20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
24d30 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
24d40 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
24d50 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
24d60 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
24d70 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
24d80 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
24d90 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
24da0 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a  ndTable(db, z, z
24db0 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20  Db);.  if( pTab 
24dc0 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61  ){.    reindexTa
24dd0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
24de0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
24df0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
24e00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
24e10 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
24e20 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
24e30 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
24e40 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
24e50 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
24e60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
24e70 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
24e80 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b  pParse, 0, iDb);
24e90 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69  .    sqlite3Refi
24ea0 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
24eb0 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
24ec0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
24ed0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24ee0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
24ef0 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f  o identify the o
24f00 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e  bject to be rein
24f10 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69  dexed");.}.#endi
24f20 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
24f30 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
24f40 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72  ure that is appr
24f50 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
24f60 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a  given Index..**.
24f70 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
24f80 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
24f90 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
24fa0 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
24fb0 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
24fc0 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
24fd0 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
24fe0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
24ff0 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
25000 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
25010 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
25020 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
25030 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
25040 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
25050 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
25060 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
25070 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
25080 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
25090 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
250a0 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
250b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
250c0 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
250d0 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
250e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
250f0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
25100 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
25110 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
25120 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
25130 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
25140 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
25150 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
25160 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25170 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
25180 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25190 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
251a0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b  oll[i];.      pK
251b0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  ey->aColl[i] = z
251c0 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  Coll==sqlite3Str
251d0 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20  BINARY ? 0 :.   
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
25200 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
25210 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
25220 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
25230 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
25240 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
25250 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
25260 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61  >nErr ){.      a
25270 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72  ssert( pParse->r
25280 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f  c==SQLITE_ERROR_
25290 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20  MISSING_COLLSEQ 
252a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
252b0 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29  x->bNoQuery==0 )
252c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61  {.        /* Dea
252d0 63 74 69 76 61 74 65 20 74 68 65 20 69 6e 64 65  ctivate the inde
252e0 78 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  x because it con
252f0 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e  tains an unknown
25300 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20   collating.     
25310 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20     ** sequence. 
25320 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   The only way to
25330 20 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e   reactive the in
25340 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64  dex is to reload
25350 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
25360 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20  schema.  Adding 
25370 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c  the missing coll
25380 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c  ating sequence l
25390 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20  ater does not.  
253a0 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76        ** reactiv
253b0 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68  e the index.  Th
253c0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61  e application ha
253d0 64 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  d the chance to 
253e0 72 65 67 69 73 74 65 72 0a 20 20 20 20 20 20 20  register.       
253f0 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20   ** the missing 
25400 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20  index using the 
25410 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64  collation-needed
25420 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a   callback.  For.
25430 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c          ** simpl
25440 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69  icity, SQLite wi
25450 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20  ll not give the 
25460 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65  application a se
25470 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20  cond chance..   
25480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25490 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d  pIdx->bNoQuery =
254a0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
254b0 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
254c0 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20  ERROR_RETRY;.   
254d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
254e0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
254f0 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  Key);.      pKey
25500 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
25510 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d    return pKey;.}
25520 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25530 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a  _OMIT_CTE./* .**
25540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25550 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65   invoked once pe
25560 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72  r CTE by the par
25570 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ser while parsin
25580 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61  g a .** WITH cla
25590 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73  use. .*/.With *s
255a0 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20  qlite3WithAdd(. 
255b0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
255c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
255d0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
255e0 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20   With *pWith,   
255f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73           /* Exis
25600 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65  ting WITH clause
25610 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
25620 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
25630 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
25640 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62  f the common-tab
25650 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
25660 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20   *pArglist,     
25670 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75  /* Optional colu
25680 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72  mn name list for
25690 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
256a0 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20  Select *pQuery  
256b0 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79          /* Query
256c0 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c   used to initial
256d0 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ize the table */
256e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
256f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
25700 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20    With *pNew;.  
25710 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20  char *zName;..  
25720 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25730 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e  e CTE name is un
25740 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73  ique within this
25750 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66   WITH clause. If
25760 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65  .  ** not, store
25770 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
25780 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65   Parse structure
25790 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  . */.  zName = s
257a0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
257b0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
257c0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
257d0 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a  ame && pWith ){.
257e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
257f0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d  or(i=0; i<pWith-
25800 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
25810 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
25820 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69  rICmp(zName, pWi
25830 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  th->a[i].zName)=
25840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
25850 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25860 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
25870 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65   WITH table name
25880 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  : %s", zName);. 
25890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
258a0 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ..  if( pWith ){
258b0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
258c0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20   sizeof(*pWith) 
258d0 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d  + (sizeof(pWith-
258e0 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e  >a[1]) * pWith->
258f0 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  nCte);.    pNew 
25900 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
25910 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42  oc(db, pWith, nB
25920 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
25930 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
25940 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
25950 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  , sizeof(*pWith)
25960 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
25970 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61   (pNew!=0 && zNa
25980 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  me!=0) || db->ma
25990 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
259a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
259b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
259c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
259d0 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29  te(db, pArglist)
259e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
259f0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51  ectDelete(db, pQ
25a00 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
25a10 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
25a20 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  me);.    pNew = 
25a30 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pWith;.  }else{.
25a40 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
25a50 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20  ->nCte].pSelect 
25a60 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e  = pQuery;.    pN
25a70 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25a80 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69  ].pCols = pArgli
25a90 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  st;.    pNew->a[
25aa0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d  pNew->nCte].zNam
25ab0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
25ac0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
25ad0 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e].zCteErr = 0;.
25ae0 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b      pNew->nCte++
25af0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
25b00 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  pNew;.}../*.** F
25b10 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
25b20 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a   of the With obj
25b30 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
25b40 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
25b50 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
25b60 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c  e3WithDelete(sql
25b70 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a  ite3 *db, With *
25b80 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57  pWith){.  if( pW
25b90 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
25ba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25bb0 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
25bc0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
25bd0 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57   Cte *pCte = &pW
25be0 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  ith->a[i];.     
25bf0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25c00 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
25c10 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73  >pCols);.      s
25c20 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
25c30 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65  te(db, pCte->pSe
25c40 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
25c50 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
25c60 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
25c70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
25c80 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b  Free(db, pWith);
25c90 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
25ca0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25cb0 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a        _OMIT_CTE) */.