/ Hex Artifact Content
Login

Artifact 0b3d422770877d74ee6d54f4c122d82c48f7d04ee3bfb91702e402de7f5c45ac:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73  Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61  e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20  rse->nTab = 1;. 
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  e);.    pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a  TE_ERROR;.  }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  b;.  char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d  f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20  ->nested<10 );  
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c  /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d  d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20  ited depth */.  
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f  .    return;   /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20  * A malloc must 
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73   }.  pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28  ted++;.  memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52  AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d  SE_TAIL_SZ);.  m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c  emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52  (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73  SE_TAIL_SZ);.  s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45  ;.  memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73  _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41  aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65  IL_SZ);.  pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23  ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65  if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73  tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73  tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74  t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64  heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  entials..*/.int 
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75  *zTable){.  retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a  te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  int i;..  /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61  .  /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c  dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61  owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65  t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69  r table.  ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  sts */.  if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c  >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73  UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c   }.#endif.  whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  e(1){.    for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f  ) ? i^1 : i;   /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65     if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c  rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69          p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d  >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29  >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20  ;.        if( p 
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20  ) return p;.    
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20   Not found.  If 
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65  the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73   looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73   temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ter.    ** then 
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  change the name 
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67  aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)!=0 ) break;. 
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65  tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62  , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61  SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  k;.    zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b  EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e  .  Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rMsg..**.** The 
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54  and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74  able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c  his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a  ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a  ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20  3LocateTable(.  
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78         /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20  port errors */. 
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20   u32 flags,     
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54          /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45  E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73  _NOERR */.  cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c  e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61  const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  se     /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d   */.  if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47  DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d  _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45  =0 .   && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20  Schema(pParse). 
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c  zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f  OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e   such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23  o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2e80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
2e90: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
2ea0: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20  base)<1 ){.     
2eb0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2ec0: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2ed0: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2ee0: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2ef0: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  d using.      **
2f00: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68   CREATE, then ch
2f10: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2f20: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2f30: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  an virtual table
2f40: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
2f50: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
2f60: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
2f70: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c  . */.      Modul
2f80: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2f90: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2fa0: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
2fb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
2fc0: 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71  f( pMod==0 && sq
2fd0: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
2fe0: 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c  Name, "pragma_",
2ff0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   7)==0 ){.      
3000: 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65 33    pMod = sqlite3
3010: 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74  PragmaVtabRegist
3020: 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  er(db, zName);. 
3030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3040: 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74 65 33   pMod && sqlite3
3050: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
3060: 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  leInit(pParse, p
3070: 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Mod) ){.        
3080: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70  return pMod->pEp
3090: 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oTab;.      }.  
30a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
30b0: 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41  f( (flags & LOCA
30c0: 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a  TE_NOERR)==0 ){.
30d0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 61 73 65        if( zDbase
30e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
30f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3100: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3110: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Name);.      }el
3130: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
3140: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3150: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
3160: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
3170: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
3180: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
3190: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
31a0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
31b0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  ** Locate the ta
31c0: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
31d0: 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y *p..**.** This
31e0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
31f0: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61  ound sqlite3Loca
3200: 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64  teTable(). The d
3210: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
3220: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61  n.** sqlite3Loca
3230: 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68  teTable() and th
3240: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
3250: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
3260: 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74  n restricts.** t
3270: 68 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68  he search to sch
3280: 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29  ema (p->pSchema)
3290: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
32a0: 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d  LL. p->pSchema m
32b0: 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c  ay be.** non-NUL
32c0: 4c 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20  L if it is part 
32d0: 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69  of a view or tri
32e0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66  gger program def
32f0: 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20  inition. See.** 
3300: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
3310: 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  t() for details.
3320: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
3330: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
3340: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
3350: 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73  se, .  u32 flags
3360: 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ,.  struct SrcLi
3370: 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20  st_item *p.){.  
3380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
3390: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53  .  assert( p->pS
33a0: 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  chema==0 || p->z
33b0: 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20  Database==0 );. 
33c0: 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20   if( p->pSchema 
33d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d  ){.    int iDb =
33e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
33f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
3400: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  , p->pSchema);. 
3410: 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d     zDb = pParse-
3420: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44  >db->aDb[iDb].zD
3430: 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  bSName;.  }else{
3440: 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44  .    zDb = p->zD
3450: 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72  atabase;.  }.  r
3460: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63  eturn sqlite3Loc
3470: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
3480: 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65   flags, p->zName
3490: 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , zDb);.}../*.**
34a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
34b0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
34c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a  that describes .
34d0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ** a particular 
34e0: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20  index given the 
34f0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64  name of that ind
3500: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61  ex.** and the na
3510: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3520: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  se that contains
3530: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52   the index..** R
3540: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
3550: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
3560: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
3570: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
3580: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
3590: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e   the.** table an
35a0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  d the first matc
35b0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65  hing index is re
35c0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
35d0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70  cking.** for dup
35e0: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d  licate index nam
35f0: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
3600: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
3610: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c  s.** TEMP first,
3620: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e   then MAIN, then
3630: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64   any auxiliary d
3640: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a  atabases added.*
3650: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41  * using the ATTA
3660: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49  CH command..*/.I
3670: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e  ndex *sqlite3Fin
3680: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  dIndex(sqlite3 *
3690: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
36a0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
36b0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78  r *zDb){.  Index
36c0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
36d0: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ;.  /* All mutex
36e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
36f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
3700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
3710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
3720: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
3730: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
3740: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
3750: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
3760: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
3770: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3780: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
3790: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
37a0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
37b0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
37c0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
37d0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
37e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
37f0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
3800: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
3810: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
3820: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29  aDb[j].zDbSName)
3830: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3850: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3860: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3870: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3880: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3890: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
38a0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
38b0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
38c0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
38d0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
38e0: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
38f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
3900: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
3910: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
3920: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3930: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
3940: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
3950: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3960: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3970: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3980: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
39a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
39b0: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
39c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
39d0: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
39e0: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
39f0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
3a00: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
3a10: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
3a20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
3a30: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
3a40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
3a50: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
3a60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3a70: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3a80: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3a90: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3aa0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3ab0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3ac0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3ad0: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3ae0: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3af0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
3b00: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
3b10: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
3b20: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
3b30: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
3b40: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
3b50: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
3b60: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3b70: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3b80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3ba0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3bb0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3bc0: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3bd0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3be0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3bf0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3c00: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3c10: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3c20: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3c30: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3c40: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3c50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3c60: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3c70: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3c80: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3c90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3ca0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3cb0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3cc0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3cd0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3ce0: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3cf0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3d00: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3d10: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3d20: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3d30: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3d40: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3d50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3d60: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3d70: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3d80: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3d90: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3da0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3db0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3dc0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3dd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3de0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3df0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
3e00: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
3e10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
3e20: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
3e30: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
3e40: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  ge;.}../*.** Loo
3e50: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69  k through the li
3e60: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62  st of open datab
3e70: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d  ase files in db-
3e80: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a  >aDb[] and if.**
3e90: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63   any have been c
3ea0: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68  losed, remove th
3eb0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  em from the list
3ec0: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Reallocate th
3ed0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73  e.** db->aDb[] s
3ee0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d  tructure to a sm
3ef0: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70  aller size, if p
3f00: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45  ossible..**.** E
3f10: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69  ntry 0 (the "mai
3f20: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64  n" database) and
3f30: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74   entry 1 (the "t
3f40: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a  emp" database).*
3f50: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64  * are never cand
3f60: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67  idates for being
3f70: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76   collapsed..*/.v
3f80: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  oid sqlite3Colla
3f90: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
3fa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3fb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
3fc0: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
3fd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
3fe0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
3ff0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4000: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
4010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
4020: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a  bFree(db, pDb->z
4030: 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  DbSName);.      
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20  pDb->zDbSName = 
4050: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
4060: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
4070: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
4080: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
4090: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
40a0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e   j++;.  }.  db->
40b0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
40c0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
40d0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
40e0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
40f0: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
4100: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
4110: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
4120: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4130: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
4140: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
4150: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
4160: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
4170: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
4180: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
4190: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
41a0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
41b0: 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20  MP schema.  The 
41c0: 72 65 73 65 74 20 69 73 20 64 65 66 65 72 72 65  reset is deferre
41d0: 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61  d if db->nSchema
41e0: 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f  Lock is not zero
41f0: 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65  ..** Deferred re
4200: 73 65 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20  sets may be run 
4210: 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20  by calling with 
4220: 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  iDb<0..*/.void s
4230: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
4240: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
4250: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
4260: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t i;.  assert( i
4270: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20  Db<db->nDb );.. 
4280: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20   if( iDb>=0 ){. 
4290: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
42a0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
42b0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
42c0: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72  .    DbSetProper
42d0: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52  ty(db, iDb, DB_R
42e0: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
42f0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
4300: 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61  b, 1, DB_ResetWa
4310: 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  nted);.    db->m
4320: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c  DbFlags &= ~DBFL
4330: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4340: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d  ;.  }..  if( db-
4350: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4360: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4370: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
4380: 0a 20 20 20 20 20 20 69 66 28 20 44 62 48 61 73  .      if( DbHas
4390: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20  Property(db, i, 
43a0: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20  DB_ResetWanted) 
43b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
43c0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62  e3SchemaClear(db
43d0: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
43e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
43f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  .  }.}../*.** Er
4400: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
4410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
4420: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
4430: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  abases (includin
4440: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20  g.** "main" and 
4450: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69  "temp") for a si
4460: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
4470: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4480: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c  d sqlite3ResetAl
4490: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
44a0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
44b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
44c0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
44d0: 6c 6c 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ll(db);.  assert
44e0: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
44f0: 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  k==0 );.  for(i=
4500: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
4510: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
4520: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
4530: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
4540: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
4550: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
4560: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
4570: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d     }.  }.  db->m
4580: 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46  DbFlags &= ~(DBF
4590: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
45a0: 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e  |DBFLAG_SchemaKn
45b0: 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65  ownOk);.  sqlite
45c0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
45d0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
45e0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
45f0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  .  sqlite3Collap
4600: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
4610: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  db);.}../*.** Th
4620: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
4630: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d  lled when a comm
4640: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  it occurs..*/.vo
4650: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
4660: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
4670: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4680: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20  db->mDbFlags &= 
4690: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68  ~DBFLAG_SchemaCh
46a0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ange;.}../*.** D
46b0: 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  elete memory all
46c0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 63  ocated for the c
46d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61  olumn names of a
46e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28   table or view (
46f0: 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f  the.** Table.aCo
4700: 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76  l[] array)..*/.v
4710: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
4720: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c  eColumnNames(sql
4730: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4740: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
4750: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
4760: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
4770: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
4780: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
4790: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
47a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
47b0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
47c0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
47d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
47e0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
47f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4800: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
4810: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
4820: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4830: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
4840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
4850: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4860: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
4870: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
4880: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
4890: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
48a0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
48b0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
48c0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
48d0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
48e0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
48f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
4900: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
4910: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
4920: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
4930: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
4940: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
4950: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4960: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
4970: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
4980: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
4990: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
49a0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
49b0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
49c0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
49d0: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65   The db paramete
49e0: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  r is optional.  
49f0: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  It is needed if 
4a00: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4a10: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f   .** contains lo
4a20: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20  okaside memory. 
4a30: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20   (Table objects 
4a40: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f  in the schema do
4a50: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b   not use.** look
4a60: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75  aside memory, bu
4a70: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c  t some ephemeral
4a80: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64   Table objects d
4a90: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64  o.)  Or the.** d
4aa0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20  b parameter can 
4ab0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d  be used with db-
4ac0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f  >pnBytesFreed to
4ad0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d   measure the mem
4ae0: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  ory.** used by t
4af0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e  he Table object.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b10: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
4b20: 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  deleteTable(sqli
4b30: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
4b40: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
4b50: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
4b60: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
4b70: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f  _DEBUG.  /* Reco
4b80: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4b90: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4ba0: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4bb0: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4bc0: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4bd0: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4be0: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4bf0: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4c00: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4c10: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4c20: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4c30: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4c40: 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  .  int nLookasid
4c50: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20  e = 0;.  if( db 
4c60: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
4c70: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4c80: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
4c90: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
4ca0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
4cb0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
4cc0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
4cd0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4ce0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4cf0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4d00: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4d10: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4d20: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4d30: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4d40: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4d50: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4d60: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4d70: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4d80: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4d90: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4da0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4db0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
4dc0: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
4dd0: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
4de0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4df0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
4e00: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
4e10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
4e20: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
4e30: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
4e40: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
4e50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
4e60: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
4e70: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
4e80: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
4e90: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
4ea0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
4eb0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
4ec0: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
4ed0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
4ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
4ef0: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
4f00: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
4f10: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
4f20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4f30: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4f40: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4f50: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4f60: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4f70: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4f80: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4f90: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4fa0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4fb0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4fc0: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
4fd0: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
4fe0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4ff0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5000: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5010: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5020: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5030: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5040: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5050: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
5060: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5070: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
5080: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
5090: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
50a0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
50b0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
50c0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
50d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
50e0: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
50f0: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5100: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5110: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5120: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5130: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5140: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5150: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
5160: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
5170: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
5180: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
5190: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
51a0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
51b0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
51c0: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
51d0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
51e0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
51f0: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5200: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5210: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5220: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5230: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5240: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5250: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
5260: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
5270: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
5280: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
5290: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
52a0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
52b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
52c0: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
52d0: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
52e0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
52f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5300: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5310: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5320: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5330: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5340: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5350: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
5360: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
5370: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
5380: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
5390: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
53a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
53b0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
53c0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
53d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
53e0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
53f0: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5400: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5410: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5420: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5430: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5440: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5450: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
5460: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
5470: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5480: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
5490: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
54a0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
54b0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5ac0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5ad0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5ae0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5af0: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5b00: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5b10: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5b20: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5b30: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5b40: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5b50: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5b60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5b70: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5b80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5b90: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5ba0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5bb0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5bd0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5be0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5bf0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5c00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5c10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5c20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5c50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5c70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5c80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5c90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ca0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5cb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5cc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5ce0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5cf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5d20: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5d30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d50: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5d60: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5d80: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5d90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5da0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5db0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5dd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5de0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5df0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5e00: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5e30: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5e40: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5e60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5e70: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5e80: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5e90: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5ea0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5eb0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5ec0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5ed0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5ee0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5ef0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5f00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5f10: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5f20: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5f30: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5f40: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5f50: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5f60: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5f80: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5fa0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5fb0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5fc0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5fd0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5fe0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5ff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6000: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6020: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6030: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6040: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6050: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
6060: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
6070: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
6080: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
6090: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
60a0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
60b0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
60c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
60d0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
60e0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
60f0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6100: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6110: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6120: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6130: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6140: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6160: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
6170: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
6180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
61a0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
61b0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
61c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
61d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
61e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
61f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6210: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6220: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6230: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6240: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6250: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
6260: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
6270: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
6280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6290: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
62a0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
62b0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
62c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
62d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
62e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
62f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6300: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6310: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6320: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6330: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6340: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6350: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
6360: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
6370: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
6380: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
6390: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
63a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65  e is used to che
63b0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20  ck if the UTF-8 
63c0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20  string zName is 
63d0: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61  a legal.** unqua
63e0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20  lified name for 
63f0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a  a new schema obj
6400: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65  ect (table, inde
6410: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72  x, view or.** tr
6420: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65  igger). All name
6430: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65  s are legal exce
6440: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65  pt those that be
6450: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72  gin with the str
6460: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22  ing.** "sqlite_"
6470: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65   (in upper, lowe
6480: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29  r or mixed case)
6490: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f  . This portion o
64a0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a  f the namespace.
64b0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66  ** is reserved f
64c0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e  or internal use.
64d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
64e0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50  heckObjectName(P
64f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
6500: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
6510: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d  {.  if( !pParse-
6520: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  >db->init.busy &
6530: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
6540: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
6550: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
6560: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
6570: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20  iteSchema)==0.  
6580: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
6590: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e  lite3StrNICmp(zN
65a0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
65b0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  7) ){.    sqlite
65c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
65d0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72  , "object name r
65e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
65f0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a  rnal use: %s", z
6600: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
6610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
6620: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6630: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6640: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d   Return the PRIM
6650: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66  ARY KEY index of
6660: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65   a table.*/.Inde
6670: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72  x *sqlite3Primar
6680: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20  yKeyIndex(Table 
6690: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20  *pTab){.  Index 
66a0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62  *p;.  for(p=pTab
66b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21  ->pIndex; p && !
66c0: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
66d0: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x(p); p=p->pNext
66e0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6700: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
6710: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
6720: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
6730: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
6740: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
6750: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
6760: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
6770: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
6780: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6790: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
67a0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
67b0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
67c0: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
67d0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
67e0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
67f0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
6800: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
6810: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
6820: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
6830: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
6840: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
6850: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
6860: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
6870: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
6880: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6890: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
68a0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
68b0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
68c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
68d0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
68e0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
68f0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
6900: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
6910: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
6920: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
6930: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
6940: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
6950: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6960: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
6970: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6990: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
69a0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
69b0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
69c0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
69d0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
69e0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
69f0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
6a00: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
6a10: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
6a20: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
6a30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6a40: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
6a50: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6a60: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
6a70: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
6a80: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6a90: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6aa0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6ab0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6ac0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6ad0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
6ae0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6af0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
6b00: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
6b10: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
6b20: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
6b30: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
6b40: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6b50: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
6b60: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
6b70: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
6b80: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6b90: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6ba0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6bb0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6bc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6bd0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6be0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6bf0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
6c00: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
6c10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
6c20: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
6c30: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
6c40: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
6c50: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
6c60: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
6c70: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6c80: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6c90: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6ca0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6cb0: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6cc0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6cd0: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
6ce0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
6cf0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6d00: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
6d10: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
6d20: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
6d30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
6d40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
6d50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6d60: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
6d70: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
6d80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6d90: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6da0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6db0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6dc0: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6dd0: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6de0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6df0: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  /..  if( db->ini
6e00: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e  t.busy && db->in
6e10: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b  it.newTnum==1 ){
6e20: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  .    /* Special 
6e30: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74  case:  Parsing t
6e40: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
6e50: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   or sqlite_temp_
6e60: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f  master schema */
6e70: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
6e80: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61  nit.iDb;.    zNa
6e90: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
6ea0: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f  rDup(db, SCHEMA_
6eb0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20  TABLE(iDb));.   
6ec0: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b   pName = pName1;
6ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6ee0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
6ef0: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
6f00: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
6f10: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
6f20: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
6f30: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
6f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66  ) return;.    if
6f50: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6f60: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
6f70: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
6f80: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
6f90: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
6fa0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
6fb0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
6fc0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
6fd0: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
6fe0: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65  base name is "te
6ff0: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a  mp" anyway.  */.
7000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7010: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
7020: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
7030: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
7040: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  alified");.     
7050: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7060: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
7070: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
7080: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61  iDb = 1;.    zNa
7090: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
70a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
70b0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e  ame);.    if( IN
70c0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
70d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
70e0: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
70f0: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61  arse, (void*)zNa
7100: 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  me, pName);.    
7110: 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  }.  }.  pParse->
7120: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e  sNameToken = *pN
7130: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ame;.  if( zName
7140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7150: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
7160: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
7170: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
7180: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
7190: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
71a0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
71b0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
71c0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
71d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
71e0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
71f0: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d  assert( isTemp==
7200: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29  0 || isTemp==1 )
7210: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69  ;.  assert( isVi
7220: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d  ew==0 || isView=
7230: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74  =1 );.  {.    st
7240: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43  atic const u8 aC
7250: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
7260: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7270: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c  ABLE,.       SQL
7280: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
7290: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51  TABLE,.       SQ
72a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
72b0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
72c0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
72d0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72  .    };.    char
72e0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
72f0: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
7300: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7310: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7320: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7330: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7340: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7350: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7360: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7370: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
7380: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
7390: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
73a0: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73  e, (int)aCode[is
73b0: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a  Temp+2*isView],.
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c         zName, 0,
73f0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
7400: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7410: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
7420: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
7430: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
7440: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20  table name does 
7450: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  not collide with
7460: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
7470: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
7480: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   name in the sam
7490: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73  e database.  Iss
74a0: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ue an error mess
74b0: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64  age if.  ** it d
74c0: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69  oes. The excepti
74d0: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61  on is if the sta
74e0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72  tement being par
74f0: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20  sed was passed. 
7500: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65   ** to an sqlite
7510: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  3_declare_vtab()
7520: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63   call. In that c
7530: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c  ase only the col
7540: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61  umn names.  ** a
7550: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65  nd types will be
7560: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20   used, so there 
7570: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65  is no need to te
7580: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65  st for namespace
7590: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73  .  ** collisions
75a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e  ..  */.  if( !IN
75b0: 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29  _SPECIAL_PARSE )
75c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  {.    char *zDb 
75d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
75e0: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
75f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
7600: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
7610: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
7620: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7630: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7640: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
7650: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
7660: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20  Name, zDb);.    
7670: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20  if( pTable ){.  
7680: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29      if( !noErr )
7690: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
76a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
76b0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65  , "table %T alre
76c0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61  ady exists", pNa
76d0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
76e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
76f0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
7700: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
7710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7720: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
7730: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
7740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
7750: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7760: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
7770: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
7780: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
7790: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
77a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
77b0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
77c0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
77d0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
77e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
77f0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7800: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
7810: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7820: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7830: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
7840: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7850: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7860: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
7870: 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  ed );.    pParse
7880: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
7890: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50  MEM_BKPT;.    pP
78a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
78b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
78c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
78d0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20  pTable->zName = 
78e0: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d  zName;.  pTable-
78f0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70  >iPKey = -1;.  p
7900: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d  Table->pSchema =
7910: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
7920: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d  chema;.  pTable-
7930: 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69  >nTabRef = 1;.#i
7940: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
7950: 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61  ULT_ROWEST.  pTa
7960: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  ble->nRowLogEst 
7970: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
7980: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
7990: 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20  OWEST);.#else.  
79a0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
79b0: 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
79c0: 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
79d0: 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
79e0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
79f0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
7a00: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72  ble==0 );.  pPar
7a10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
7a20: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
7a30: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
7a40: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
7a50: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
7a60: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
7a70: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
7a80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7a90: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
7aa0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
7ab0: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
7ac0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
7ad0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
7ae0: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
7af0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7b00: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
7b10: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
7b20: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
7b30: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
7b40: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
7b50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7b60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
7b70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
7b80: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68      pTable->pSch
7b90: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70  ema->pSeqTab = p
7ba0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  Table;.  }.#endi
7bb0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  f..  /* Begin ge
7bc0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64  nerating the cod
7bd0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65  e that will inse
7be0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  rt the table rec
7bf0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ord into.  ** th
7c00: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
7c10: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20  table.  Note in 
7c20: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20  particular that 
7c30: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64  we must go ahead
7c40: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61  .  ** and alloca
7c50: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  te the record nu
7c60: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7c70: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42  le entry now.  B
7c80: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50  efore any.  ** P
7c90: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
7ca0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72  IQUE keywords ar
7cb0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65  e parsed.  Those
7cc0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63   keywords will c
7cd0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65  ause.  ** indice
7ce0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  s to be created 
7cf0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65  and the table re
7d00: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62  cord must come b
7d10: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20  efore the .  ** 
7d20: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c  indices.  Hence,
7d30: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
7d40: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
7d50: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
7d60: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a  ed.  ** now..  *
7d70: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
7d80: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73  t.busy && (v = s
7d90: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7da0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20  arse))!=0 ){.   
7db0: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20   int addr1;.    
7dc0: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
7dd0: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
7de0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a  g2, reg3;.    /*
7df0: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e   nullRow[] is an
7e00: 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64   OP_Record encod
7e10: 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e  ing of a row con
7e20: 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20  taining 5 NULLs 
7e30: 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
7e40: 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77  nst char nullRow
7e50: 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20  [] = { 6, 0, 0, 
7e60: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73  0, 0, 0 };.    s
7e70: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
7e80: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
7e90: 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  , 1, iDb);..#ifn
7ea0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7eb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7ec0: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29   if( isVirtual )
7ed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7ee0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
7ef0: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23  VBegin);.    }.#
7f00: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
7f10: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74   the file format
7f20: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e   and encoding in
7f30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
7f40: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c  ve not been set,
7f50: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65   .    ** set the
7f60: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  m now..    */.  
7f70: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d    reg1 = pParse-
7f80: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50  >regRowid = ++pP
7f90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7fa0: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72  reg2 = pParse->r
7fb0: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73  egRoot = ++pPars
7fc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7fd0: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  3 = ++pParse->nM
7fe0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
7ff0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8000: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  ReadCookie, iDb,
8010: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c   reg3, BTREE_FIL
8020: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
8030: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
8040: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
8050: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
8060: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
8070: 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65  _If, reg3); Vdbe
8080: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
8090: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
80a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
80b0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
80c0: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
80d0: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
80e0: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
80f0: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
8100: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8110: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
8120: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
8130: 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a  T, fileFormat);.
8140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8150: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
8160: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
8170: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
8180: 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73   ENC(db));.    s
8190: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
81a0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
81b0: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
81c0: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
81d0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
81e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
81f0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
8200: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
8210: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
8220: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
8230: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
8240: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
8250: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
8260: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
8270: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
8280: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
8290: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
82a0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
82b0: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  ry is left in re
82c0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
82d0: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20  egRowid..    ** 
82e0: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
82f0: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
8300: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e  table is left in
8310: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67   reg pParse->reg
8320: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  Root..    ** The
8330: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20   rowid and root 
8340: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
8350: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  es are needed by
8360: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20   the code that. 
8370: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64     ** sqlite3End
8380: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72  Table will gener
8390: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
83a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
83b0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
83c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
83d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
83e0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
83f0: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
8400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8410: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8420: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
8430: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8440: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50  f.    {.      pP
8450: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
8460: 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  =.         sqlit
8470: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8480: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20  OP_CreateBtree, 
8490: 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45 45  iDb, reg2, BTREE
84a0: 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d 0a  _INTKEY);.    }.
84b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d      sqlite3OpenM
84c0: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73  asterTable(pPars
84d0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
84e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
84f0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30  , OP_NewRowid, 0
8500: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
8520: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65  , OP_Blob, 6, re
8530: 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20  g3, 0, nullRow, 
8540: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
8550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8560: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
8570: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
8580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
8590: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
85a0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
85b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
85c0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
85d0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
85e0: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
85f0: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
8600: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
8610: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
8620: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
8630: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
8640: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8650: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
8660: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72  rn;.}../* Set pr
8670: 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61  operties of a ta
8680: 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64  ble column based
8690: 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c   on the (magical
86a0: 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65  ).** name of the
86b0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20   column..*/.#if 
86c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49  SQLITE_ENABLE_HI
86d0: 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69  DDEN_COLUMNS.voi
86e0: 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50  d sqlite3ColumnP
86f0: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d  ropertiesFromNam
8700: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43  e(Table *pTab, C
8710: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20  olumn *pCol){.  
8720: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
8730: 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  icmp(pCol->zName
8740: 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20  , "__hidden__", 
8750: 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  10)==0 ){.    pC
8760: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol->colFlags |= 
8770: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a  COLFLAG_HIDDEN;.
8780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
8790: 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e   && pCol!=pTab->
87a0: 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31  aCol && (pCol[-1
87b0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ].colFlags & COL
87c0: 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a  FLAG_HIDDEN) ){.
87d0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
87e0: 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64  gs |= TF_OOOHidd
87f0: 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  en;.  }.}.#endif
8800: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
8810: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65  ew column to the
8820: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8830: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
8840: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ed..**.** The pa
8850: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
8860: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72  routine once for
8870: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63   each column dec
8880: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61  laration.** in a
8890: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
88a0: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65  atement.  sqlite
88b0: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65  3StartTable() ge
88c0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72  ts called.** fir
88d0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73  st to get things
88e0: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68   going.  Then th
88f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8900: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a  lled for each.**
8910: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64   column..*/.void
8920: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
8930: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
8940: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54   Token *pName, T
8950: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8960: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
8970: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8980: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43  char *zType;.  C
8990: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
89a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
89b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  rse->db;.  if( (
89c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
89d0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
89e0: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  rn;.  if( p->nCo
89f0: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
8a00: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
8a10: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
8a20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8a30: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
8a40: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
8a50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
8a60: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  rn;.  }.  z = sq
8a70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8a80: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20  (db, pName->n + 
8a90: 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20  pType->n + 2);. 
8aa0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
8ab0: 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  rn;.  if( IN_REN
8ac0: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c  AME_OBJECT ) sql
8ad0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
8ae0: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
8af0: 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 6d  *)z, pName);.  m
8b00: 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e  emcpy(z, pName->
8b10: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
8b20: 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b  z[pName->n] = 0;
8b30: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74  .  sqlite3Dequot
8b40: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  e(z);.  for(i=0;
8b50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
8b60: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
8b70: 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e  3_stricmp(z, p->
8b80: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  aCol[i].zName)==
8b90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8ba0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8bb0: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f  e, "duplicate co
8bc0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20  lumn name: %s", 
8bd0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
8be0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8c00: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70    }.  }.  if( (p
8c10: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30  ->nCol & 0x7)==0
8c20: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a   ){.    Column *
8c30: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d  aNew;.    aNew =
8c40: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
8c50: 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d  c(db,p->aCol,(p-
8c60: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28  >nCol+8)*sizeof(
8c70: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
8c80: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
8c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8ca0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8cb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8cc0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61  .    p->aCol = a
8cd0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20  New;.  }.  pCol 
8ce0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43  = &p->aCol[p->nC
8cf0: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  ol];.  memset(pC
8d00: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  ol, 0, sizeof(p-
8d10: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  >aCol[0]));.  pC
8d20: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20  ol->zName = z;. 
8d30: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
8d40: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
8d50: 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69  (p, pCol);. .  i
8d60: 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29  f( pType->n==0 )
8d70: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
8d80: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
8d90: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
8da0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
8db0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a   affinity.    **
8dc0: 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61 20 64   'BLOB' with a d
8dd0: 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 34  efault size of 4
8de0: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 70   bytes. */.    p
8df0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8e00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
8e10: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  .    pCol->szEst
8e20: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
8e30: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8e40: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8e50: 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65 33 47   if( 4>=sqlite3G
8e60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f  lobalConfig.szSo
8e70: 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20  rterRef ){.     
8e80: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8e90: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45  |= COLFLAG_SORTE
8ea0: 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RREF;.    }.#end
8eb0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
8ec0: 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69  zType = z + sqli
8ed0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b  te3Strlen30(z) +
8ee0: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   1;.    memcpy(z
8ef0: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20  Type, pType->z, 
8f00: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a  pType->n);.    z
8f10: 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d  Type[pType->n] =
8f20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   0;.    sqlite3D
8f30: 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20  equote(zType);. 
8f40: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
8f50: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  y = sqlite3Affin
8f60: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 70  ityType(zType, p
8f70: 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  Col);.    pCol->
8f80: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
8f90: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d  LAG_HASTYPE;.  }
8fa0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20  .  p->nCol++;.  
8fb0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
8fc0: 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a  ntName.n = 0;.}.
8fd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8fe0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8ff0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9000: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9010: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9020: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9030: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
9040: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
9050: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
9060: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
9070: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
9080: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
9090: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
90a0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
90b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
90c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
90d0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
90e0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
90f0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
9100: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
9110: 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  Col;.  p = pPars
9120: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9130: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
9140: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
9150: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
9160: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
9170: 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74  -1];.  pCol->not
9180: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
9190: 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67  or;.  p->tabFlag
91a0: 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75  s |= TF_HasNotNu
91b0: 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ll;..  /* Set th
91c0: 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c  e uniqNotNull fl
91d0: 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45  ag on any UNIQUE
91e0: 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61   or PK indexes a
91f0: 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20  lready created. 
9200: 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75   ** on this colu
9210: 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  mn.  */.  if( pC
9220: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
9230: 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b  OLFLAG_UNIQUE ){
9240: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
9250: 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
9260: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
9270: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
9280: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
9290: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
92a0: 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72  1 && pIdx->onErr
92b0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
92c0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
92d0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e  iColumn[0]==p->n
92e0: 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  Col-1 ){.       
92f0: 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
9300: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ll = 1;.      }.
9310: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9320: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75  ** Scan the colu
9330: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79  mn type name zTy
9340: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65  pe (length nType
9350: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  ) and return the
9360: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61  .** associated a
9370: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a  ffinity type..**
9380: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9390: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64   does a case-ind
93a0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20  ependent search 
93b0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  of zType for the
93c0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20   .** substrings 
93d0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
93e0: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f   table. If one o
93f0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
9400: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
9410: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
9420: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75  affinity is retu
9430: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63  rned. If zType c
9440: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20  ontains.** more 
9450: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  than one of the 
9460: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72  substrings, entr
9470: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74  ies toward the t
9480: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61  op of .** the ta
9490: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74  ble take priorit
94a0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
94b0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f  if zType is 'BLO
94c0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54  BINT', .** SQLIT
94d0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73  E_AFF_INTEGER is
94e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
94f0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c   Substring     |
9500: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d   Affinity.** ---
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9530: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c   'INT'         |
9540: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9550: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20  GER.** 'CHAR'   
9560: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
9570: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27  F_TEXT.** 'CLOB'
9580: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9590: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45  _AFF_TEXT.** 'TE
95a0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  XT'        | SQL
95b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
95c0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'BLOB'        | 
95d0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a  SQLITE_AFF_BLOB.
95e0: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20  ** 'REAL'       
95f0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
9600: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20  AL.** 'FLOA'    
9610: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
9620: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20  _REAL.** 'DOUB' 
9630: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
9640: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49  AFF_REAL.**.** I
9650: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  f none of the su
9660: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
9670: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20  above table are 
9680: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
9690: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20  _AFF_NUMERIC is 
96a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61  returned..*/.cha
96b0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  r sqlite3Affinit
96c0: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  yType(const char
96d0: 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a 70   *zIn, Column *p
96e0: 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Col){.  u32 h = 
96f0: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
9700: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9710: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
9720: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
9730: 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29  assert( zIn!=0 )
9740: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
9750: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
9760: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
9770: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
9780: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
9790: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
97a0: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
97b0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
97c0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
97d0: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
97e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
97f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
9800: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
9810: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
9820: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9830: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
9840: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
9850: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9860: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9870: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9880: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
9890: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
98a0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
98b0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
98c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
98d0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
98e0: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
98f0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
9900: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
9910: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
9920: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
9930: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9940: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
9950: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
9960: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9970: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
9980: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
9990: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
99a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
99b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
99c0: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
99d0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
99e0: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
99f0: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
9a00: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
9a10: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
9a20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9a30: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9a40: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
9a50: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9a60: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
9a70: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
9a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
9a90: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
9aa0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9ab0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9ac0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9ad0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
9ae0: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
9af0: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
9b00: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
9b10: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
9b20: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
9b30: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9b40: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
9b50: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9b60: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
9b70: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
9b80: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
9b90: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
9ba0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9bb0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9bc0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
9bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9be0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9bf0: 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c   pCol is not NUL
9c00: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
9c10: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
9c20: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
9c30: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
9c40: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
9c50: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
9c60: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
9c70: 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
9c80: 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f 2a 20  int v = 0;   /* 
9c90: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20  default size is 
9ca0: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a  approx 4 bytes *
9cb0: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51  /.    if( aff<SQ
9cc0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
9ce0: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77  har ){.        w
9cf0: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29  hile( zChar[0] )
9d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9d10: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
9d20: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Char[0]) ){.    
9d30: 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 28          /* BLOB(
9d40: 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20  k), VARCHAR(k), 
9d50: 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f  CHAR(k) -> r=(k/
9d60: 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  4+1) */.        
9d70: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e      sqlite3GetIn
9d80: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a  t32(zChar, &v);.
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9da0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9db0: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9dc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9de0: 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20 42 4c   v = 16;   /* BL
9df0: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d  OB, TEXT, CLOB -
9e00: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32  > r=5  (approx 2
9e10: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20  0 bytes)*/.     
9e20: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
9e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
9e40: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
9e50: 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c 69 74      if( v>=sqlit
9e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9e70: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9e80: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9e90: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9ea0: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9eb0: 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20 76 2f  endif.    v = v/
9ec0: 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 76  4 + 1;.    if( v
9ed0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a  >255 ) v = 255;.
9ee0: 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20      pCol->szEst 
9ef0: 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
9f00: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aff;.}../*.** 
9f10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9f20: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
9f30: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
9f40: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9f50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
9f60: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
9f70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9f80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
9f90: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
9fa0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
9fb0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
9fc0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
9fd0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
9fe0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
9ff0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a000: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
a010: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
a020: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
a030: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
a040: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
a050: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a060: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20 20  DefaultValue(.  
a070: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a090: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a0a0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a0c0: 20 70 61 72 73 65 64 20 65 78 70 72 65 73 73 69   parsed expressi
a0d0: 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  on of the defaul
a0e0: 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e  t value */.  con
a0f0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c  st char *zStart,
a100: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
a110: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  f the default va
a120: 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f  lue text */.  co
a130: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20  nst char *zEnd  
a140: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a150: 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20 65  character past e
a160: 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76 61 6c  nd of defaut val
a170: 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  ue text */.){.  
a180: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
a190: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
a1a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a1b0: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72  ->db;.  p = pPar
a1c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a1d0: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
a1e0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
a1f0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
a200: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
a210: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
a220: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20 64  unction(pExpr, d
a230: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
a240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a260: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
a270: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20   column [%s] is 
a280: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20  not constant",. 
a290: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a           pCol->z
a2a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
a2b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  {.      /* A cop
a2c0: 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73  y of pExpr is us
a2d0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
a2e0: 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70  e original, as p
a2f0: 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20  Expr contains.  
a300: 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68      ** tokens th
a310: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61  at point to vola
a320: 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20  tile memory..   
a330: 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72     */.      Expr
a340: 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   x;.      sqlite
a350: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a360: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
a370: 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30      memset(&x, 0
a380: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
a390: 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50      x.op = TK_SP
a3a0: 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54  AN;.      x.u.zT
a3b0: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  oken = sqlite3Db
a3c0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61  SpanDup(db, zSta
a3d0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20  rt, zEnd);.     
a3e0: 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72   x.pLeft = pExpr
a3f0: 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20  ;.      x.flags 
a400: 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20  = EP_Skip;.     
a410: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73   pCol->pDflt = s
a420: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
a430: 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45  , &x, EXPRDUP_RE
a440: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
a450: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78  ite3DbFree(db, x
a460: 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  .u.zToken);.    
a470: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 52  }.  }.  if( IN_R
a480: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
a490: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
a4a0: 65 45 78 70 72 55 6e 6d 61 70 28 70 50 61 72 73  eExprUnmap(pPars
a4b0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  e, pExpr);.  }. 
a4c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
a4d0: 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d  te(db, pExpr);.}
a4e0: 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64  ../*.** Backward
a4f0: 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s Compatibility 
a500: 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73  Hack:.** .** His
a510: 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73  torical versions
a520: 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70   of SQLite accep
a530: 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20 63  ted strings as c
a540: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a  olumn names in.*
a550: 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52  * indexes and PR
a560: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
a570: 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49  aints and in UNI
a580: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
a590: 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
a5a0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a5b0: 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c  E xyz(a,b,c,d,e,
a5c0: 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29  PRIMARY KEY('a')
a5d0: 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20  ,UNIQUE('b','c' 
a5e0: 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a  COLLATE trim).**
a5f0: 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45       CREATE INDE
a600: 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27  X abc ON xyz('c'
a610: 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f  ,'d' DESC,'e' CO
a620: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53  LLATE nocase DES
a630: 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  C);.**.** This i
a640: 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f  s goofy.  But to
a650: 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77 61   preserve backwa
a660: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
a670: 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f  y we continue to
a680: 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20  .** accept it.  
a690: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
a6a0: 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
a6b0: 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20  conversion.  It 
a6c0: 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20  converts.** the 
a6d0: 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e  expression given
a6e0: 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74   in its argument
a6f0: 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e   from a TK_STRIN
a700: 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a  G into a TK_ID.*
a710: 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  * if the express
a720: 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b  ion is just a TK
a730: 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20  _STRING with an 
a740: 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45  optional COLLATE
a750: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74   clause..** If t
a760: 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69 73  he epxression is
a770: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
a780: 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20  than TK_STRING, 
a790: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a7a0: 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a  s.** unchanged..
a7b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a7c0: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
a7d0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
a7e0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e   p->op==TK_STRIN
a7f0: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  G ){.    p->op =
a800: 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20   TK_ID;.  }else 
a810: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
a820: 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66  LLATE && p->pLef
a830: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47  t->op==TK_STRING
a840: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74   ){.    p->pLeft
a850: 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20  ->op = TK_ID;.  
a860: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67  }.}../*.** Desig
a870: 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59  nate the PRIMARY
a880: 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61 62   KEY for the tab
a890: 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20  le.  pList is a 
a8a0: 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a  list of names .*
a8b0: 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61  * of columns tha
a8c0: 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61  t form the prima
a8d0: 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73  ry key.  If pLis
a8e0: 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
a8f0: 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
a900: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
a910: 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  n of the table i
a920: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
a930: 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65  y..**.** A table
a940: 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73   can have at mos
a950: 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  t one primary ke
a960: 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 65  y.  If the table
a970: 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20   already has.** 
a980: 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61  a primary key (a
a990: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 73  nd this is the s
a9a0: 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65  econd primary ke
a9b0: 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  y) then create a
a9c0: 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n.** error..**.*
a9d0: 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52 59  * If the PRIMARY
a9e0: 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e   KEY is on a sin
a9f0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65  gle column whose
aa00: 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e 54   datatype is INT
aa10: 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65  EGER,.** then we
aa20: 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65   will try to use
aa30: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20   that column as 
aa40: 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20  the rowid.  Set 
aa50: 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a  the Table.iPKey.
aa60: 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
aa70: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
aa80: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  truction to be t
aa90: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
aaa0: 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ** INTEGER PRIMA
aab0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20  RY KEY column.  
aac0: 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73  Table.iPKey is s
aad0: 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72  et to -1 if ther
aae0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47  e is.** no INTEG
aaf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
ab00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79  **.** If the key
ab10: 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47   is not an INTEG
ab20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
ab30: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e  then create a un
ab40: 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f  ique.** index fo
ab50: 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69  r the key.  No i
ab60: 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
ab70: 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d  for INTEGER PRIM
ab80: 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69  ARY KEYs..*/.voi
ab90: 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d  d sqlite3AddPrim
aba0: 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20  aryKey(.  Parse 
abb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
abc0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
abd0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
abe0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
abf0: 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20   field names to 
ac00: 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
ac10: 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
ac20: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
ac30: 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73  with a uniquenes
ac40: 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  s conflict */.  
ac50: 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20  int autoInc,    
ac60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
ac70: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b   AUTOINCREMENT k
ac80: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
ac90: 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
aca0: 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49  rder     /* SQLI
acb0: 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c  TE_SO_ASC or SQL
acc0: 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29  ITE_SO_DESC */.)
acd0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
ace0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
acf0: 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  ble;.  Column *p
ad00: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
ad10: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
ad20: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
ad30: 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70  pTab==0 ) goto p
ad40: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
ad50: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
ad60: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
ad70: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
ad80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ad90: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
ada0: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
adb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
adc0: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
add0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
ade0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
adf0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
ae00: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
ae10: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
ae20: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ae30: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
ae40: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
ae50: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
ae60: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70  Col[iCol];.    p
ae70: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
ae80: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
ae90: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
aea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
aeb0: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
aec0: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
aed0: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
aee0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 45 78        Expr *pCEx
aef0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
af00: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
af10: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
af20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
af30: 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
af40: 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
af50: 49 64 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20  Id(pCExpr);.    
af60: 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
af70: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
af80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
af90: 43 4e 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e  CName = pCExpr->
afa0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
afb0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
afc0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
afd0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
afe0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
aff0: 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61  ICmp(zCName, pTa
b000: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
b010: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
b020: 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
b030: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
b040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
b050: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
b060: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
b070: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b080: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
b090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b0b0: 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20   nTerm==1.   && 
b0c0: 70 43 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74  pCol.   && sqlit
b0d0: 65 33 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65  e3StrICmp(sqlite
b0e0: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c  3ColumnType(pCol
b0f0: 2c 22 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29  ,""), "INTEGER")
b100: 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72  ==0.   && sortOr
b110: 64 65 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44  der!=SQLITE_SO_D
b120: 45 53 43 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ESC.  ){.    if(
b130: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
b140: 54 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  T && pList ){.  
b150: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
b160: 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
b170: 73 65 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65 79  se, &pTab->iPKey
b180: 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  , pList->a[0].pE
b190: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
b1a0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
b1b0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
b1c0: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
b1d0: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
b1e0: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
b1f0: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
b200: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
b210: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
b220: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20  toincrement;.   
b230: 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61   if( pList ) pPa
b240: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
b250: 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  r = pList->a[0].
b260: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c  sortOrder;.  }el
b270: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
b280: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
b290: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
b2a0: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
b2b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b2c0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
b2d0: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
b2e0: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
b2f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
b300: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
b310: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b320: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
b330: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
b340: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
b350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b360: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
b370: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 53 51 4c  ortOrder, 0, SQL
b380: 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
b390: 41 52 59 4b 45 59 29 3b 0a 20 20 20 20 70 4c 69  ARYKEY);.    pLi
b3a0: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
b3b0: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
b3c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b3d0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
b3e0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
b3f0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
b400: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
b410: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
b420: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
b430: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
b440: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
b450: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
b460: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
b470: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
b480: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
b490: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
b4a0: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
b4b0: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
b4c0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
b4d0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54  E_OMIT_CHECK.  T
b4e0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
b4f0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
b500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
b510: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
b520: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
b530: 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26  CLARE_VTAB.   &&
b540: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49 73   !sqlite3BtreeIs
b550: 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62  Readonly(db->aDb
b560: 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70  [db->init.iDb].p
b570: 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  Bt).  ){.    pTa
b580: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
b590: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b5a0: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
b5b0: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
b5c0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
b5d0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
b5e0: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
b5f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
b600: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
b610: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
b620: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
b630: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
b640: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
b650: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
b660: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
b670: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
b680: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
b690: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
b6a0: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
b6b0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
b6c0: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
b6d0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
b6e0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
b6f0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
b700: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
b710: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
b720: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
b730: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
b740: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
b750: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
b760: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
b770: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
b780: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
b790: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
b7a0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
b7b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b7c0: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
b7d0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
b7e0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
b7f0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
b800: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
b810: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
b820: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
b830: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
b840: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
b850: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
b860: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
b870: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
b880: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
b890: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b8a0: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
b8b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
b8c0: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
b8d0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
b8e0: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
b8f0: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
b900: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
b910: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
b920: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
b930: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
b940: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
b950: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
b960: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
b970: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
b980: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
b990: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
b9a0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
b9b0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
b9c0: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
b9d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
b9e0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b9f0: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
ba00: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
ba10: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
ba20: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
ba30: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ba40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ba50: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
ba60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ba70: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
ba80: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ba90: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
baa0: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
bab0: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
bac0: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
bad0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
bae0: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
baf0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
bb00: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
bb10: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
bb20: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
bb30: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
bb40: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
bb50: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
bb60: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
bb70: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
bb80: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
bb90: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bba0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
bbb0: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
bbc0: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
bbd0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
bbe0: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
bbf0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
bc00: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
bc10: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
bc20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
bc30: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
bc40: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
bc50: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
bc60: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
bc70: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
bc80: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
bc90: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
bca0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
bcb0: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
bcc0: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
bcd0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
bce0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
bcf0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
bd00: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
bd10: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
bd20: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
bd30: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
bd40: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
bd50: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
bd60: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
bd70: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
bd80: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
bd90: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
bda0: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
bdb0: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
bdc0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
bdd0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
bde0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
bdf0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
be00: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
be10: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
be20: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
be30: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
be40: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
be50: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
be60: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
be70: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
be80: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
be90: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
bea0: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
beb0: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
bec0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
bed0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
bee0: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
bef0: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
bf00: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
bf10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
bf20: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
bf30: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
bf40: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
bf50: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
bf60: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
bf70: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
bf80: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
bf90: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
bfa0: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
bfb0: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
bfc0: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
bfd0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
bfe0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
bff0: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
c000: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
c010: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
c020: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
c030: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
c040: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
c050: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
c060: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
c070: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c080: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
c090: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
c0a0: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
c0b0: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
c0c0: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
c0d0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
c0e0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
c0f0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
c100: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
c110: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
c120: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
c130: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
c140: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
c150: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
c160: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
c170: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
c180: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
c190: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
c1a0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
c1b0: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
c1c0: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
c1d0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
c1e0: 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d 45  h..**.** IMPLEME
c1f0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 34  NTATION-OF: R-34
c200: 32 33 30 2d 35 36 30 34 39 20 53 51 4c 69 74 65  230-56049 SQLite
c210: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69   automatically i
c220: 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65  ncrements.** the
c230: 20 73 63 68 65 6d 61 2d 76 65 72 73 69 6f 6e 20   schema-version 
c240: 77 68 65 6e 65 76 65 72 20 74 68 65 20 73 63 68  whenever the sch
c250: 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a 2a 2f 0a  ema changes..*/.
c260: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
c270: 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a  geCookie(Parse *
c280: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
c290: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c2a0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
c2b0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c2c0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
c2d0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
c2e0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
c2f0: 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  b, 0) );.  sqlit
c300: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c310: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
c320: 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f  b, BTREE_SCHEMA_
c330: 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20 20 20 20  VERSION, .      
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
c350: 74 29 28 31 2b 28 75 6e 73 69 67 6e 65 64 29 64  t)(1+(unsigned)d
c360: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
c370: 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
c380: 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ie));.}../*.** M
c390: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
c3a0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
c3b0: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
c3c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
c3d0: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
c3e0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
c3f0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
c400: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
c410: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
c420: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
c430: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
c440: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
c450: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
c460: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
c470: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
c480: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
c490: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
c4a0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
c4b0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
c4c0: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
c4d0: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
c4e0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
c4f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c500: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
c510: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
c520: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
c530: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
c540: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
c550: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
c560: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c570: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
c580: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
c590: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
c5a0: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
c5b0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
c5c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
c5d0: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
c5e0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
c5f0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
c600: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
c610: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
c620: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
c630: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
c640: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
c650: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
c660: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
c670: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
c680: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
c690: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
c6a0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
c6b0: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
c6c0: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
c6d0: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
c6e0: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
c6f0: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
c700: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
c710: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
c720: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
c730: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
c740: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
c750: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
c760: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
c770: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
c780: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
c790: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
c7a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c7b0: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
c7c0: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
c7d0: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
c7e0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
c7f0: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
c800: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
c810: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
c820: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
c830: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
c840: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
c850: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
c860: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
c870: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
c880: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
c890: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
c8a0: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
c8b0: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
c8c0: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
c8d0: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
c8e0: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
c8f0: 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20  )!=TK_ID.       
c900: 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a       || zIdent[j
c910: 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]!=0.           
c920: 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28   || j==0;..  if(
c930: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
c940: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
c950: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
c960: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
c970: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
c980: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
c990: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
c9a0: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
c9b0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
c9c0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
c9d0: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
c9e0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
c9f0: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
ca00: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
ca10: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
ca20: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
ca30: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
ca40: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
ca50: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
ca60: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
ca70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
ca80: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
ca90: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
caa0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
cab0: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
cac0: 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65  TableStmt(sqlite
cad0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  3 *db, Table *p)
cae0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
caf0: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
cb00: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
cb10: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43  Sep2, *zEnd;.  C
cb20: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
cb30: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
cb40: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
cb50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
cb60: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
cb70: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
cb80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b  Col->zName) + 5;
cb90: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
cba0: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
cbb0: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
cbc0: 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b   .    zSep = "";
cbd0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
cbe0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
cbf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
cc00: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
cc10: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
cc20: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
cc30: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
cc40: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
cc50: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
cc60: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
cc70: 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d  n);.  if( zStmt=
cc80: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
cc90: 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
cca0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ccb0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
ccc0: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
ccd0: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
cce0: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
ccf0: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
cd00: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
cd10: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
cd20: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
cd30: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
cd40: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
cd50: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
cd60: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
cd70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
cd80: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
cd90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
cda0: 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20 20 2a 2f  E_AFF_BLOB    */
cdb0: 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20   "",.        /* 
cdc0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
cdd0: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
cde0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
cdf0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
ce00: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
ce10: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
ce20: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
ce30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
ce40: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
ce50: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
ce60: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
ce70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ce80: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
ce90: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cea0: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
ceb0: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
cec0: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
ced0: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
cee0: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
cef0: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
cf00: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
cf10: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
cf20: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
cf30: 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20 30 20 29  _AFF_BLOB >= 0 )
cf40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cf50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
cf60: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3c 20 41  ITE_AFF_BLOB < A
cf70: 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29  rraySize(azType)
cf80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cf90: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cfa0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
cfb0: 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
cfc0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
cfd0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
cfe0: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
cff0: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
d000: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
d010: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65  UMERIC );.    te
d020: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
d030: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d040: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
d050: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
d060: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
d070: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20  TE_AFF_REAL );. 
d080: 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20     .    zType = 
d090: 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66  azType[pCol->aff
d0a0: 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41  inity - SQLITE_A
d0b0: 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65  FF_BLOB];.    le
d0c0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
d0d0: 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
d0e0: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
d0f0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
d100: 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20 20 20 20  FF_BLOB .       
d110: 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66       || pCol->af
d120: 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41  finity==sqlite3A
d130: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
d140: 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d  e, 0) );.    mem
d150: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
d160: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
d170: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
d180: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
d190: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
d1a0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
d1b0: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
d1c0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
d1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
d1e0: 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  e an Index objec
d1f0: 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75  t to hold N colu
d200: 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75  mns total.  Retu
d210: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
d220: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53  on success and S
d230: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61  QLITE_NOMEM on a
d240: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a  n OOM error..*/.
d250: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a  static int resiz
d260: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c  eIndexObject(sql
d270: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
d280: 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20  *pIdx, int N){. 
d290: 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20   char *zExtra;. 
d2a0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
d2b0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
d2c0: 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =N ) return SQLI
d2d0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
d2e0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
d2f0: 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ==0 );.  nByte =
d300: 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20   (sizeof(char*) 
d310: 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20  + sizeof(i16) + 
d320: 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d  1)*N;.  zExtra =
d330: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d340: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
d350: 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30  .  if( zExtra==0
d360: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d370: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d  _NOMEM_BKPT;.  m
d380: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
d390: 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65  dx->azColl, size
d3a0: 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e  of(char*)*pIdx->
d3b0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d3c0: 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73  ->azColl = (cons
d3d0: 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b  t char**)zExtra;
d3e0: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
d3f0: 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20  eof(char*)*N;.  
d400: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
d410: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73  Idx->aiColumn, s
d420: 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d  izeof(i16)*pIdx-
d430: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d440: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  x->aiColumn = (i
d450: 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45  16*)zExtra;.  zE
d460: 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69  xtra += sizeof(i
d470: 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28  16)*N;.  memcpy(
d480: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53  zExtra, pIdx->aS
d490: 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e  ortOrder, pIdx->
d4a0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
d4b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
d4c0: 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49  u8*)zExtra;.  pI
d4d0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b  dx->nColumn = N;
d4e0: 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a  .  pIdx->isResiz
d4f0: 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ed = 1;.  return
d500: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
d510: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
d520: 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74  e total row widt
d530: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a  h for a table..*
d540: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d550: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
d560: 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20  (Table *pTab){. 
d570: 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65   unsigned wTable
d580: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f   = 0;.  const Co
d590: 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20  lumn *pTabCol;. 
d5a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
d5b0: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
d5c0: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
d5d0: 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f  i>0; i--, pTabCo
d5e0: 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65  l++){.    wTable
d5f0: 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45   += pTabCol->szE
d600: 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54  st;.  }.  if( pT
d610: 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54  ab->iPKey<0 ) wT
d620: 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e  able++;.  pTab->
d630: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
d640: 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a  e3LogEst(wTable*
d650: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  4);.}../*.** Est
d660: 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67  imate the averag
d670: 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20  e size of a row 
d680: 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f  for an index..*/
d690: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
d6a0: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
d6b0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
d6c0: 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20  unsigned wIndex 
d6d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
d6e0: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43  const Column *aC
d6f0: 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ol = pIdx->pTabl
d700: 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69  e->aCol;.  for(i
d710: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
d720: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
d730: 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43  16 x = pIdx->aiC
d740: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73  olumn[i];.    as
d750: 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54  sert( x<pIdx->pT
d760: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  able->nCol );.  
d770: 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20    wIndex += x<0 
d780: 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d  ? 1 : aCol[pIdx-
d790: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a  >aiColumn[i]].sz
d7a0: 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d  Est;.  }.  pIdx-
d7b0: 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69  >szIdxRow = sqli
d7c0: 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78  te3LogEst(wIndex
d7d0: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  *4);.}../* Retur
d7e0: 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20  n true if value 
d7f0: 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f  x is found any o
d800: 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c  f the first nCol
d810: 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f   entries of aiCo
d820: 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l[].*/.static in
d830: 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73  t hasColumn(cons
d840: 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e  t i16 *aiCol, in
d850: 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a  t nCol, int x){.
d860: 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20    while( nCol-- 
d870: 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61  > 0 ) if( x==*(a
d880: 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e  iCol++) ) return
d890: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
d8a0: 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75 74 65 20  }../* Recompute 
d8b0: 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20  the colNotIdxed 
d8c0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 49 6e 64  field of the Ind
d8d0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e 6f 74  ex..**.** colNot
d8e0: 49 64 78 65 64 20 69 73 20 61 20 62 69 74 6d 61  Idxed is a bitma
d8f0: 73 6b 20 74 68 61 74 20 68 61 73 20 61 20 30 20  sk that has a 0 
d900: 62 69 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  bit representing
d910: 20 65 61 63 68 20 69 6e 64 65 78 65 64 0a 2a 2a   each indexed.**
d920: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72   columns that ar
d930: 65 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  e within the fir
d940: 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 6f 66  st 63 columns of
d950: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65   the table.  The
d960: 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65 72 20 62  .** high-order b
d970: 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49 64 78 65  it of colNotIdxe
d980: 64 20 69 73 20 61 6c 77 61 79 73 20 31 2e 20 20  d is always 1.  
d990: 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64 20 63 6f  All unindexed co
d9a0: 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20  lumns.** of the 
d9b0: 74 61 62 6c 65 20 68 61 76 65 20 61 20 31 2e 0a  table have a 1..
d9c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 4e 6f 74  **.** The colNot
d9d0: 49 64 78 65 64 20 6d 61 73 6b 20 69 73 20 41 4e  Idxed mask is AN
d9e0: 44 2d 65 64 20 77 69 74 68 20 74 68 65 20 53 72  D-ed with the Sr
d9f0: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
da00: 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20 64 65 74  d mask.** to det
da10: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 69 6e  ermine if the in
da20: 64 65 78 20 69 73 20 63 6f 76 65 72 69 6e 67 20  dex is covering 
da30: 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
da40: 20 76 6f 69 64 20 72 65 63 6f 6d 70 75 74 65 43   void recomputeC
da50: 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64  olumnsNotIndexed
da60: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
da70: 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a   Bitmask m = 0;.
da80: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
da90: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31  =pIdx->nColumn-1
daa0: 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20  ; j>=0; j--){.  
dab0: 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
dac0: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
dad0: 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
dae0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
daf0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
db00: 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
db10: 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  2 );.      if( x
db20: 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41  <BMS-1 ) m |= MA
db30: 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a  SKBIT(x);.    }.
db40: 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63 6f 6c 4e    }.  pIdx->colN
db50: 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b 0a 20 20  otIdxed = ~m;.  
db60: 61 73 73 65 72 74 28 20 28 70 49 64 78 2d 3e 63  assert( (pIdx->c
db70: 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36 33 29 3d  olNotIdxed>>63)=
db80: 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =1 );.}../*.** T
db90: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
dba0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
dbb0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
dbc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
dbd0: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
dbe0: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
dbf0: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
dc00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
dc10: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
dc20: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
dc30: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
dc40: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
dc50: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
dc60: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
dc70: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
dc80: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
dc90: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
dca0: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
dcb0: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
dcc0: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
dcd0: 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20 63 6f   (1)  Set all co
dce0: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
dcf0: 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20  MARY KEY schema 
dd00: 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54  object to be NOT
dd10: 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 32   NULL..**     (2
dd20: 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20 70 61  )  Convert P3 pa
dd30: 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65 20 4f  rameter of the O
dd40: 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 66 72  P_CreateBtree fr
dd50: 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 20  om BTREE_INTKEY 
dd60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 74  .**          int
dd70: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
dd80: 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42 79 70  .**     (3)  Byp
dd90: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
dda0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
ddb0: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
ddc0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  y.**          fo
ddd0: 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  r the PRIMARY KE
dde0: 59 20 61 73 20 74 68 65 20 70 72 69 6d 61 72 79  Y as the primary
ddf0: 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e 6f   key index is no
de00: 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 64  w.**          id
de10: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
de20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
de30: 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68 65  ble entry of the
de40: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 2a   table itself..*
de50: 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20 74  *     (4)  Set t
de60: 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f 66  he Index.tnum of
de70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
de80: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e   Index object in
de90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dea0: 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20 72   schema to the r
deb0: 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ootpage from the
dec0: 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20   main table..** 
ded0: 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c      (5)  Add all
dee0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74   table columns t
def0: 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  o the PRIMARY KE
df00: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a  Y Index object.*
df10: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68  *          so th
df20: 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  at the PRIMARY K
df30: 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  EY is a covering
df40: 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72   index.  The sur
df50: 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  plus.**         
df60: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72   columns are par
df70: 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c  t of KeyInfo.nAl
df80: 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e  lField and are n
df90: 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20  ot used for.**  
dfa0: 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20          sorting 
dfb0: 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69  or lookup or uni
dfc0: 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a  queness checks..
dfd0: 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c  **     (6)  Repl
dfe0: 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61  ace the rowid ta
dff0: 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61  il on all automa
e000: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
e010: 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20  d UNIQUE.**     
e020: 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74       indices wit
e030: 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  h the PRIMARY KE
e040: 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  Y columns..**.**
e050: 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   For virtual tab
e060: 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20 69 73  les, only (1) is
e070: 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   performed..*/.s
e080: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
e090: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
e0a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
e0b0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
e0c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
e0d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
e0e0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
e0f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
e100: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e110: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
e120: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
e130: 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50   /* Mark every P
e140: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
e150: 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65  n as NOT NULL (e
e160: 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74  xcept for impost
e170: 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a  er tables).  */.
e180: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
e190: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b  imposterTable ){
e1a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e1b0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
e1c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  {.      if( (pTa
e1d0: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
e1e0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
e1f0: 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20  IMKEY)!=0 ){.   
e200: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
e210: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f  i].notNull = OE_
e220: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
e230: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
e240: 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f 70  onvert the P3 op
e250: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
e260: 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f  CreateBtree opco
e270: 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  de from BTREE_IN
e280: 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42  TKEY.  ** into B
e290: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20  TREE_BLOBKEY..  
e2a0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
e2b0: 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20  >addrCrTab ){.  
e2c0: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
e2d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
e2e0: 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73 65  angeP3(v, pParse
e2f0: 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54 52  ->addrCrTab, BTR
e300: 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d  EE_BLOBKEY);.  }
e310: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
e320: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
e330: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
e340: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
e350: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
e360: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
e370: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
e380: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
e390: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
e3a0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
e3b0: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
e3c0: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
e3d0: 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b   Token ipkToken;
e3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
e3f0: 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c  nInit(&ipkToken,
e400: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
e410: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
e420: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
e430: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
e440: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e460: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
e470: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70  c(db, TK_ID, &ip
e480: 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  kToken, 0));.   
e490: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
e4a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73  return;.    pLis
e4b0: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
e4c0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
e4d0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
e4e0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
e4f0: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
e500: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
e510: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
e520: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
e530: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30  pTab->keyConf, 0
e540: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45    SQLITE_IDXTYPE
e570: 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20  _PRIMARYKEY);.  
e580: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
e590: 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
e5a0: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
e5b0: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
e5c0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
e5d0: 78 28 70 54 61 62 29 3b 0a 20 20 20 20 70 54 61  x(pTab);.    pTa
e5e0: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
e5f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
e600: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
e610: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
e620: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
e630: 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64  emove all redund
e640: 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  ant columns from
e650: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e660: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
e670: 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50  change.    ** "P
e680: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61  RIMARY KEY(a,b,a
e690: 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74  ,b,c,b,c,d)" int
e6a0: 6f 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20  o just "PRIMARY 
e6b0: 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20  KEY(a,b,c,d)".  
e6c0: 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64  Later.    ** cod
e6d0: 65 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52  e assumes the PR
e6e0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69  IMARY KEY contai
e6f0: 6e 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63  ns no repeated c
e700: 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  olumns..    */. 
e710: 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c     for(i=j=1; i<
e720: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b  pPk->nKeyCol; i+
e730: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61  +){.      if( ha
e740: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
e750: 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b 2d 3e 61  olumn, j, pPk->a
e760: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
e770: 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c         pPk->nCol
e780: 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  umn--;.      }el
e790: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d  se{.        pPk-
e7a0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b 5d 20 3d  >aiColumn[j++] =
e7b0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e7c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
e7d0: 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  .    pPk->nKeyCo
e7e0: 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20 61 73 73  l = j;.  }.  ass
e7f0: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
e800: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
e810: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 64 62 2d   = 1;.  if( !db-
e820: 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61  >init.imposterTa
e830: 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e 69 71 4e  ble ) pPk->uniqN
e840: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 6e 50  otNull = 1;.  nP
e850: 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k = pPk->nKeyCol
e860: 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74  ;..  /* Bypass t
e870: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
e880: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62  he PRIMARY KEY b
e890: 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c  tree and the sql
e8a0: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
e8b0: 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 54 68 69  table entry. Thi
e8c0: 73 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  s is only requir
e8d0: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ed if currently 
e8e0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 0a  generating VDBE.
e8f0: 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72 20 61 20    ** code for a 
e900: 43 52 45 41 54 45 20 54 41 42 4c 45 20 28 6e 6f  CREATE TABLE (no
e910: 74 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 6f  t when parsing o
e920: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ne as part of re
e930: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20 64 61 74  ading.  ** a dat
e940: 61 62 61 73 65 20 73 63 68 65 6d 61 29 2e 20 20  abase schema).  
e950: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
e960: 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  k->tnum>0 ){.   
e970: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69   assert( db->ini
e980: 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
e990: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e9a0: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d  geOpcode(v, pPk-
e9b0: 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b  >tnum, OP_Goto);
e9c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e9d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
e9e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74  PRIMARY KEY is t
e9f0: 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61  he table root pa
ea00: 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75  ge */.  pPk->tnu
ea10: 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  m = pTab->tnum;.
ea20: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
ea30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
ea40: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  sentation of all
ea50: 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20   UNIQUE indices 
ea60: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20  by converting.  
ea70: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ** the final row
ea80: 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f  id column into o
ea90: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  ne or more colum
eaa0: 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ns of the PRIMAR
eab0: 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Y KEY..  */.  fo
eac0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
ead0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
eae0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
eaf0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28    int n;.    if(
eb00: 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
eb10: 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69  ex(pIdx) ) conti
eb20: 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  nue;.    for(i=n
eb30: 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  =0; i<nPk; i++){
eb40: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
eb50: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
eb60: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
eb70: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
eb80: 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20  mn[i]) ) n++;.  
eb90: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30    }.    if( n==0
eba0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
ebb0: 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75 70  s index is a sup
ebc0: 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72 69  erset of the pri
ebd0: 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20  mary key */.    
ebe0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
ebf0: 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  = pIdx->nKeyCol;
ec00: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
ec10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
ec20: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
ec30: 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d  (db, pIdx, pIdx-
ec40: 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65  >nKeyCol+n) ) re
ec50: 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  turn;.    for(i=
ec60: 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  0, j=pIdx->nKeyC
ec70: 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b  ol; i<nPk; i++){
ec80: 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43  .      if( !hasC
ec90: 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f  olumn(pIdx->aiCo
eca0: 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  lumn, pIdx->nKey
ecb0: 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Col, pPk->aiColu
ecc0: 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  mn[i]) ){.      
ecd0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
ece0: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  [j] = pPk->aiCol
ecf0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  umn[i];.        
ed00: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20  pIdx->azColl[j] 
ed10: 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  = pPk->azColl[i]
ed20: 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  ;.        j++;. 
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ed40: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
ed50: 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b  Column>=pIdx->nK
ed60: 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61  eyCol+n );.    a
ed70: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
ed80: 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a  lumn>=j );.  }..
ed90: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62    /* Add all tab
eda0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  le columns to th
edb0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
edc0: 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  dex.  */.  if( n
edd0: 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  Pk<pTab->nCol ){
ede0: 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65 49  .    if( resizeI
edf0: 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70  ndexObject(db, p
ee00: 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Pk, pTab->nCol) 
ee10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
ee20: 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c  r(i=0, j=nPk; i<
ee30: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
ee40: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
ee50: 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
ee60: 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20  lumn, j, i) ){. 
ee70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
ee80: 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  <pPk->nColumn );
ee90: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69  .        pPk->ai
eea0: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20  Column[j] = i;. 
eeb0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f         pPk->azCo
eec0: 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[j] = sqlite3S
eed0: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
eee0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    j++;.      }. 
eef0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
ef00: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a   pPk->nColumn==j
ef10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ef20: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b  pTab->nCol==j );
ef30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
ef40: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  k->nColumn = pTa
ef50: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  b->nCol;.  }.  r
ef60: 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
ef70: 6f 74 49 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a  otIndexed(pPk);.
ef80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ef90: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
efa0: 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69  to report the fi
efb0: 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72  nal ")" that ter
efc0: 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45  minates.** a CRE
efd0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
efe0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ent..**.** The t
eff0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
f000: 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e  hat other action
f010: 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62   routines have b
f020: 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20  een building.** 
f030: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
f040: 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61  internal hash ta
f050: 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e  bles, assuming n
f060: 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a  o errors have.**
f070: 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   occurred..**.**
f080: 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   An entry for th
f090: 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20  e table is made 
f0a0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  in the master ta
f0b0: 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c  ble on disk, unl
f0c0: 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61  ess.** this is a
f0d0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f0e0: 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   or db->init.bus
f0f0: 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e  y==1.  When db->
f100: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20  init.busy==1.** 
f110: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
f120: 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
f130: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f140: 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a  because we just.
f150: 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  ** connected to 
f160: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
f170: 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69  because the sqli
f180: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
f190: 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20  has.** recently 
f1a0: 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20  changed, so the 
f1b0: 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74  entry for this t
f1c0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
f1d0: 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71  sts in.** the sq
f1e0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
f1f0: 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61  e.  We do not wa
f200: 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20  nt to create it 
f210: 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  again..**.** If 
f220: 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75  the pSelect argu
f230: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
f240: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
f250: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
f260: 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  was called to cr
f270: 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e  eate a table gen
f280: 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a  erated from a .*
f290: 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  * "CREATE TABLE 
f2a0: 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e  ... AS SELECT ..
f2b0: 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ." statement.  T
f2c0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
f2d0: 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61  of.** the new ta
f2e0: 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74  ble will match t
f2f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
f300: 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
f310: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54  void sqlite3EndT
f320: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
f330: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
f340: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
f350: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f   */.  Token *pCo
f360: 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ns,           /*
f370: 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61   The ',' token a
f380: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f  fter the last co
f390: 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20  lumn defn. */.  
f3a0: 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
f3b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
f3c0: 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e  )' before option
f3d0: 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  s in the CREATE 
f3e0: 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61  TABLE */.  u8 ta
f3f0: 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20 20  bOpts,          
f400: 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c     /* Extra tabl
f410: 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c  e options. Usual
f420: 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  ly 0. */.  Selec
f430: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
f440: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
f450: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
f460: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
f470: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20  .  Table *p;    
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f490: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  The new table */
f4a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f4b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20   pParse->db; /* 
f4c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
f4d0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
f4e0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
f4f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
f500: 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  se in which the 
f510: 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20  table lives */. 
f520: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
f530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
f540: 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f   implied index o
f550: 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  f the table */..
f560: 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26 26    if( pEnd==0 &&
f570: 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20   pSelect==0 ){. 
f580: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f590: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
f5a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
f5b0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
f5c0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
f5d0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  0 ) return;..  /
f5e0: 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
f5f0: 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d  t.busy is 1 it m
f600: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
f610: 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20  ing the SQL off 
f620: 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65  the.  ** "sqlite
f630: 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c  _master" or "sql
f640: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
f650: 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69   table on the di
f660: 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e  sk..  ** So do n
f670: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
f680: 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74  disk again.  Ext
f690: 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61  ract the root pa
f6a0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66  ge number.  ** f
f6b0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  or the table fro
f6c0: 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e  m the db->init.n
f6d0: 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28  ewTnum field.  (
f6e0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  The page number.
f6f0: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65    ** should have
f700: 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20   been put there 
f710: 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65  by the sqliteOpe
f720: 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20  nCb routine.).  
f730: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
f740: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
f750: 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 1, that means
f760: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71 6c   this is the sql
f770: 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
f780: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20 53  table itself.  S
f790: 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d 6f  o mark it read-o
f7a0: 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nly..  */.  if( 
f7b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f7c0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
f7d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f7e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f7f0: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74  , "");.      ret
f800: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
f810: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
f820: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 69  t.newTnum;.    i
f830: 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29 20  f( p->tnum==1 ) 
f840: 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  p->tabFlags |= T
f850: 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d 0a  F_Readonly;.  }.
f860: 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72  .  /* Special pr
f870: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49 54  ocessing for WIT
f880: 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65  HOUT ROWID Table
f890: 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f 70  s */.  if( tabOp
f8a0: 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74 52  ts & TF_WithoutR
f8b0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20  owid ){.    if( 
f8c0: 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  (p->tabFlags & T
f8d0: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
f8e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f8f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
f900: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55 54  ,.          "AUT
f910: 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20 61  OINCREMENT not a
f920: 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f 55  llowed on WITHOU
f930: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22 29  T ROWID tables")
f940: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
f950: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
f960: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
f970: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d 3d  HasPrimaryKey)==
f980: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f990: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
f9a0: 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 20  e, "PRIMARY KEY 
f9b0: 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c 65  missing on table
f9c0: 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   %s", p->zName);
f9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f9e0: 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d    p->tabFlags |=
f9f0: 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64   TF_WithoutRowid
fa00: 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
fa10: 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
fa20: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
fa30: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
fa40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
fa50: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
fa60: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
fa70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
fa80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fa90: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
faa0: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
fab0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
fac0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
fad0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
fae0: 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
faf0: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
fb00: 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
fb10: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
fb20: 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
fb30: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
fb40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fb50: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
fb60: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
fb70: 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
fb80: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
fb90: 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
fba0: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
fbb0: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
fbc0: 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
fbd0: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
fbe0: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
fbf0: 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
fc00: 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
fc10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
fc20: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
fc30: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
fc40: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
fc50: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
fc60: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
fc70: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
fc80: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
fc90: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
fca0: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
fcb0: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
fcc0: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
fcd0: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
fce0: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
fcf0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
fd00: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
fd10: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
fd20: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
fd30: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
fd40: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
fd50: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
fd60: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
fd70: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
fd80: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
fd90: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
fda0: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
fdb0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
fdc0: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
fdd0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
fde0: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
fdf0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fe00: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
fe10: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
fe20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe30: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
fe40: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20   0);..    /* .  
fe50: 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
fe60: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65  zType for the ne
fe70: 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e  w view or table.
fe80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fe90: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
fea0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
feb0: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
fec0: 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
fed0: 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
fee0: 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
fef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff00: 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
ff10: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
ff20: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
ff30: 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
ff40: 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
ff50: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
ff60: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
ff70: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
ff80: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
ff90: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
ffa0: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
ffb0: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
ffc0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
ffd0: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
ffe0: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
fff0: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
10000 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
10010 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
10020 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
10030 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
10040 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
10050 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
10060 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
10070 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
10080 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
10090 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
100a0 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
100b0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
100c0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
100d0 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
100e0 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
100f0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
10100 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
10110 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
10120 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
10130 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
10140 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
10150 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
10160 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
10170 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
10180 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
10190 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
101a0 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
101b0 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
101c0 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
101d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
101e0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ect ){.      Sel
101f0 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
10200 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53 45   /* Where the SE
10210 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f 72  LECT should stor
10220 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
10230 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64 3b     int regYield;
10240 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10250 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72 6f  er holding co-ro
10260 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69 6e  utine entry-poin
10270 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10280 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 2f  ddrTop;        /
10290 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f 2d  * Top of the co-
102a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20  routine */.     
102b0 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20 20   int regRec;    
102c0 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72 64       /* A record
102d0 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69 6e   to be insert in
102e0 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
102f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
10300 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f 2a  gRowid;       /*
10310 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e 65   Rowid of the ne
10320 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72 74  xt row to insert
10330 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
10340 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f 2a  drInsLoop;    /*
10350 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
10360 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 72   for inserting r
10370 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61 62  ows */.      Tab
10380 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 20  le *pSelTab;    
10390 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61 74   /* A table that
103a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 53   describes the S
103b0 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
103c0 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c 64  ..      regYield
103d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
103e0 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63 20  m;.      regRec 
103f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
10400 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
10410 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10420 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
10430 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31 29  pParse->nTab==1)
10440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  ;.      sqlite3M
10450 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
10460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10470 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
10480 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50 61  penWrite, 1, pPa
10490 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69 44  rse->regRoot, iD
104a0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
104b0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
104c0 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 29   OPFLAG_P2ISREG)
104d0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
104e0 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  nTab = 2;.      
104f0 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
10500 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10510 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 73  (v) + 1;.      s
10520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10530 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
10540 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20  tine, regYield, 
10550 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
10560 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
10570 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
10580 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
10590 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
105a0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
105b0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69  Select);.      i
105c0 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
105d0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73  return;.      as
105e0 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
105f0 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f   );.      p->nCo
10600 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
10610 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  l;.      p->aCol
10620 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
10630 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d  ;.      pSelTab-
10640 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
10650 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d   pSelTab->aCol =
10660 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
10670 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
10680 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20   pSelTab);.     
10690 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
106a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
106b0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
106c0 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
106d0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
106e0 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65  se, pSelect, &de
106f0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
10700 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
10710 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  turn;.      sqli
10720 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
10730 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64 29  ine(v, regYield)
10740 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10750 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10760 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20  ddrTop - 1);.   
10770 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d     addrInsLoop =
10780 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10790 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
107a0 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20  dest.iSDParm);. 
107b0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
107c0 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
107d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
107e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
107f0 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73 74  dest.iSdst, dest
10800 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29 3b  .nSdst, regRec);
10810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
10820 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20 70  bleAffinity(v, p
10830 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10840 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10850 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c   OP_NewRowid, 1,
10860 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10880 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
10890 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65 67  , 1, regRec, reg
108a0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
108b0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
108c0 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20   addrInsLoop);. 
108d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
108e0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
108f0 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  InsLoop);.      
10900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10910 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31  1(v, OP_Close, 1
10920 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10930 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d   Compute the com
10940 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
10950 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
10960 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  nt */.    if( pS
10970 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a  elect ){.      z
10980 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61 62  Stmt = createTab
10990 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20  leStmt(db, p);. 
109a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
109b0 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74  Token *pEnd2 = t
109c0 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73 65  abOpts ? &pParse
109d0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70  ->sLastToken : p
109e0 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  End;.      n = (
109f0 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20  int)(pEnd2->z - 
10a00 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10a10 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en.z);.      if(
10a20 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b   pEnd2->z[0]!=';
10a30 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e  ' ) n += pEnd2->
10a40 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  n;.      zStmt =
10a50 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
10a60 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
10a70 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
10a80 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
10a90 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
10aa0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10ab0 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
10ac0 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
10ad0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
10ae0 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
10af0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
10b00 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
10b10 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
10b20 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
10b30 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
10b40 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
10b50 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
10b60 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
10b70 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
10b80 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
10b90 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
10ba0 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
10bb0 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
10bc0 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
10bd0 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
10be0 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
10bf0 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
10c00 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
10c10 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
10c20 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79 70  NAME,.      zTyp
10c30 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
10c40 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
10c50 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
10c60 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
10c70 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
10c80 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
10c90 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
10ca0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
10cb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
10cc0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10cd0 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
10ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10cf0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
10d00 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
10d10 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
10d20 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
10d30 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
10d40 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
10d50 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
10d60 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
10d70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
10d80 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
10d90 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
10da0 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
10db0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
10dc0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
10dd0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
10de0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
10df0 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28   0) );.      if(
10e00 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70   pDb->pSchema->p
10e10 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  SeqTab==0 ){.   
10e20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
10e30 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
10e40 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
10e50 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74  E TABLE %Q.sqlit
10e60 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c  e_sequence(name,
10e70 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20  seq)",.         
10e80 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a 20   pDb->zDbSName. 
10e90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
10ea0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
10eb0 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
10ec0 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
10ed0 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
10ee0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
10ef0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
10f00 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
10f10 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
10f20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
10f30 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
10f40 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
10f50 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
10f60 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
10f70 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
10f80 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
10f90 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
10fa0 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
10fb0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
10fc0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
10fd0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
10fe0 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
10ff0 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
11000 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
11010 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11020 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
11030 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
11040 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
11050 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
11060 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
11070 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
11080 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11090 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
110a0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
110b0 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
110c0 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
110d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d        sqlite3Oom
110e0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20  Fault(db);.     
110f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
11100 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
11110 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
11120 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42  ->mDbFlags |= DB
11130 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
11140 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
11150 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
11160 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
11170 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11180 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
11190 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
111a0 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
111b0 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
111c0 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
111d0 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
111e0 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
111f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
11200 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
11210 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
11220 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
11230 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
11240 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
11250 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
11260 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
11270 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
11280 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
11290 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
112a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
112b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
112c0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
112d0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
112e0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
112f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
11300 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
11310 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
11320 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
11330 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
11340 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
11350 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
11360 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
11370 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
11380 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
11390 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
113a0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
113b0 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
113c0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
113d0 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
113e0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
113f0 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
11400 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
11410 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11420 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69  view */.  ExprLi
11430 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20  st *pCNames, /* 
11440 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66  Optional list of
11450 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   view column nam
11460 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
11470 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
11480 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11490 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
114a0 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
114b0 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
114c0 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
114d0 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
114e0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
114f0 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
11500 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
11510 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
11520 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
11530 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
11540 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
11550 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
11560 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
11570 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
11580 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
11590 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
115a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
115b0 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
115c0 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
115d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
115e0 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
115f0 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
11600 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
11610 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
11620 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20  view_fail;.  }. 
11630 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
11640 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
11650 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
11660 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
11670 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
11680 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
11690 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
116a0 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61  nErr ) goto crea
116b0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20  te_view_fail;.  
116c0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
116d0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
116e0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
116f0 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
11700 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
11710 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
11720 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
11730 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
11740 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
11750 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
11760 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
11770 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20  Fix, pSelect) ) 
11780 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
11790 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  _fail;..  /* Mak
117a0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
117b0 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
117c0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
117d0 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
117e0 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
117f0 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
11800 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
11810 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
11820 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
11830 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
11840 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
11850 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
11860 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
11870 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
11880 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
11890 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
118a0 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
118b0 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52 45    */.  if( IN_RE
118c0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  NAME_OBJECT ){. 
118d0 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20     p->pSelect = 
118e0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65  pSelect;.    pSe
118f0 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lect = 0;.  }els
11900 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  e{.    p->pSelec
11910 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
11920 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
11930 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
11940 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68 65  );.  }.  p->pChe
11950 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ck = sqlite3Expr
11960 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e 61  ListDup(db, pCNa
11970 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45 44  mes, EXPRDUP_RED
11980 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  UCE);.  if( db->
11990 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
119a0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
119b0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  fail;..  /* Loca
119c0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
119d0 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
119e0 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
119f0 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
11a00 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
11a10 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
11a20 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 61  >sLastToken;.  a
11a30 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30 5d  ssert( sEnd.z[0]
11a40 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d 30  !=0 || sEnd.n==0
11a50 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a   );.  if( sEnd.z
11a60 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
11a70 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
11a80 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
11a90 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
11aa0 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
11ab0 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  >z);.  assert( n
11ac0 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  >0 );.  z = pBeg
11ad0 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
11ae0 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
11af0 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
11b00 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
11b10 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
11b20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
11b30 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
11b40 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
11b50 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
11b60 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
11b70 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
11b80 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
11b90 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f   0, 0);..create_
11ba0 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c  view_fail:.  sql
11bb0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11bc0 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
11bd0 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
11be0 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
11bf0 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c 69  ite3RenameExprli
11c00 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c 20  stUnmap(pParse, 
11c10 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20 20  pCNames);.  }.  
11c20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
11c30 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65  elete(db, pCName
11c40 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  s);.  return;.}.
11c50 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11c60 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
11c70 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
11c80 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
11c90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11ca0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11cb0 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
11cc0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
11cd0 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
11ce0 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
11cf0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
11d00 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
11d10 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
11d20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
11d30 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
11d40 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
11d50 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
11d60 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
11d70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
11d80 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
11d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11da0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
11db0 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
11dc0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
11dd0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
11de0 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
11df0 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
11e00 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
11e10 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
11e20 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
11e30 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
11e40 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
11e50 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
11e60 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
11e70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11e80 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
11e90 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
11ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
11eb0 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
11ec0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
11ed0 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
11ee0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
11ef0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
11f00 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
11f10 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
11f20 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e 64   errors */.#ifnd
11f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11f40 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
11f50 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  t rc;.#endif.#if
11f60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11f70 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
11f80 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20 78   sqlite3_xauth x
11f90 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20 53  Auth;       /* S
11fa0 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e 74  aved xAuth point
11fb0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
11fc0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
11fd0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
11fe0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11ff0 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65 6d  BLE.  db->nSchem
12000 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d 20  aLock++;.  rc = 
12010 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
12020 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
12030 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e 53  Table);.  db->nS
12040 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20 69  chemaLock--;.  i
12050 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
12060 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
12070 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c   IsVirtual(pTabl
12080 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  e) ) return 0;.#
12090 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
120a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
120b0 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20    /* A positive 
120c0 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63  nCol means the c
120d0 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72  olumns names for
120e0 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20   this view are. 
120f0 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   ** already know
12100 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  n..  */.  if( pT
12110 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72  able->nCol>0 ) r
12120 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
12130 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69   negative nCol i
12140 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b  s a special mark
12150 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  er meaning that 
12160 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  we are currently
12170 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20  .  ** trying to 
12180 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  compute the colu
12190 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65  mn names.  If we
121a0 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74   enter this rout
121b0 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20  ine with.  ** a 
121c0 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69  negative nCol, i
121d0 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d  t means two or m
121e0 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61  ore views form a
121f0 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73   loop, like this
12200 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
12210 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20  CREATE VIEW one 
12220 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
12230 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43   two;.  **     C
12240 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41  REATE VIEW two A
12250 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
12260 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  one;.  **.  ** A
12270 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72  ctually, the err
12280 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20  or above is now 
12290 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
122a0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f  reaching this po
122b0 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  int..  ** But th
122c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
122d0 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74   is still import
122e0 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63  ant as it does c
122f0 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74  ome up.  ** in t
12300 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
12310 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  ** .  **     CRE
12320 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65  ATE TABLE main.e
12330 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20  x1(a);.  **     
12340 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57  CREATE TEMP VIEW
12350 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61   ex1 AS SELECT a
12360 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20   FROM ex1;.  ** 
12370 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12380 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f  M temp.ex1;.  */
12390 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
123a0 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col<0 ){.    sql
123b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
123c0 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73  rse, "view %s is
123d0 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69   circularly defi
123e0 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e  ned", pTable->zN
123f0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
12400 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
12410 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d  ( pTable->nCol>=
12420 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  0 );..  /* If we
12430 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
12440 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20  t means we need 
12450 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74  to compute the t
12460 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a  able names..  **
12470 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
12480 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65  all to sqlite3Re
12490 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
124a0 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e  ) will expand an
124b0 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65  y.  ** "*" eleme
124c0 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  nts in the resul
124d0 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69  ts set of the vi
124e0 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69  ew and will assi
124f0 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20  gn cursors.  ** 
12500 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  to the elements 
12510 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
12520 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e  se.  But we do n
12530 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68  ot want these ch
12540 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  anges.  ** to be
12550 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20   permanent.  So 
12560 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
12570 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70  is done on a cop
12580 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  y of the SELECT.
12590 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
125a0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
125b0 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  view..  */.  ass
125c0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65  ert( pTable->pSe
125d0 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d  lect );.  pSel =
125e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
125f0 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53  p(db, pTable->pS
12600 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
12610 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65 66   pSel ){.#ifndef
12620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
12630 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20 65  ERTABLE.    u8 e
12640 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61 72  ParseMode = pPar
12650 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b 0a  se->eParseMode;.
12660 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61 72      pParse->ePar
12670 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f 4d  seMode = PARSE_M
12680 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e 64  ODE_NORMAL;.#end
12690 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  if.    n = pPars
126a0 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
126b0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
126c0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
126d0 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
126e0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
126f0 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
12700 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2b  kaside.bDisable+
12710 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
12720 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
12730 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
12740 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
12750 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
12760 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12770 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12780 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12790 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
127a0 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
127b0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
127c0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
127d0 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
127e0 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
127f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
12800 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54 61  = n;.    if( pTa
12810 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
12820 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56       /* CREATE V
12830 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73 74  IEW name(arglist
12840 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a  ) AS ....      *
12850 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  * The names of t
12860 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
12870 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b 65  e table are take
12880 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  n from.      ** 
12890 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69 73  arglist which is
128a0 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62 6c   stored in pTabl
128b0 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65 20  e->pCheck.  The 
128c0 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20 20  pCheck field.   
128d0 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68     ** normally h
128e0 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73 74  olds CHECK const
128f0 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64  raints on an ord
12900 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75 74  inary table, but
12910 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 20   for.      ** a 
12920 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74 68  VIEW it holds th
12930 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
12940 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f   names..      */
12950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
12960 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
12970 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
12980 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129a0 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61              &pTa
129b0 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  ble->nCol, &pTab
129c0 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  le->aCol);.     
129d0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
129e0 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ailed==0 .      
129f0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
12a00 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54  ==0.       && pT
12a10 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  able->nCol==pSel
12a20 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
12a30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12a40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
12a50 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
12a60 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
12a70 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20  pTable, pSel);. 
12a80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
12a90 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
12aa0 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12ab0 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20  VIEW name AS... 
12ac0 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67 75   without an argu
12ad0 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73  ment list.  Cons
12ae0 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20 74  truct.      ** t
12af0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
12b00 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
12b10 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
12b20 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
12b30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12b40 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
12b50 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
12b60 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
12b70 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
12b80 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
12b90 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
12ba0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
12bb0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
12bc0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
12bd0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
12be0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12bf0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
12c00 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
12c10 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ) );.    }else{.
12c20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
12c30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
12c40 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
12c50 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
12c60 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
12c70 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
12c80 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12c90 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  l);.    db->look
12ca0 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d  aside.bDisable--
12cb0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12cc0 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
12cd0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
12ce0 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73 65  rseMode = eParse
12cf0 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  Mode;.#endif.  }
12d00 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
12d10 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65  ++;.  }.  pTable
12d20 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ->pSchema->schem
12d30 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  aFlags |= DB_Unr
12d40 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66 28  esetViews;.  if(
12d50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12d60 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
12d70 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  DeleteColumnName
12d80 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20  s(db, pTable);. 
12d90 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
12da0 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  = 0;.    pTable-
12db0 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23  >nCol = 0;.  }.#
12dc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12dd0 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
12de0 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
12df0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
12e00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
12e10 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
12e20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
12e30 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
12e40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12e50 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
12e60 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
12e70 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
12e80 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
12e90 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
12ea0 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
12eb0 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
12ec0 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
12ed0 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
12ee0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
12ef0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
12f00 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20  b, idx, 0) );.  
12f10 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
12f20 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
12f30 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
12f40 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
12f50 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
12f60 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
12f70 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
12f80 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
12f90 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
12fa0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12fb0 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
12fc0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
12fd0 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
12fe0 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
12ff0 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a  ames(db, pTab);.
13000 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
13010 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62   = 0;.      pTab
13020 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
13030 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50  }.  }.  DbClearP
13040 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c  roperty(db, idx,
13050 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73   DB_UnresetViews
13060 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
13070 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65  ine sqliteViewRe
13080 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64  setAll(A,B).#end
13090 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
130a0 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  T_VIEW */../*.**
130b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
130c0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
130d0 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74  VDBE to adjust t
130e0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
130f0 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51  ma.** used by SQ
13100 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74  Lite when the bt
13110 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20  ree layer moves 
13120 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67  a table root pag
13130 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70  e. The.** root-p
13140 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  age of a table o
13150 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62  r index in datab
13160 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e  ase iDb has chan
13170 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a  ged from iFrom.*
13180 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20  * to iTo..**.** 
13190 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54  Ticket #1728:  T
131a0 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20  he symbol table 
131b0 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74  might still cont
131c0 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ain information.
131d0 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64  ** on tables and
131e0 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74  /or indices that
131f0 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73   are the process
13200 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65   of being delete
13210 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65  d..** If you are
13220 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66   unlucky, one of
13230 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69   those deleted i
13240 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73  ndices or tables
13250 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74   might.** have t
13260 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65  he same rootpage
13270 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72   number as the r
13280 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  eal table or ind
13290 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65  ex that is.** be
132a0 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77  ing moved.  So w
132b0 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65  e cannot stop se
132c0 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68  arching after th
132d0 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a  e first match .*
132e0 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69  * because the fi
132f0 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20  rst match might 
13300 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
13310 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
13320 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61  s.** or tables a
13330 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65  nd not the table
13340 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61  /index that is a
13350 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f  ctually being mo
13360 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20  ved..** We must 
13370 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67  continue looping
13380 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65   until all table
13390 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69  s and indices wi
133a0 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d  th.** rootpage==
133b0 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20  iFrom have been 
133c0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76  converted to hav
133d0 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20  e a rootpage of 
133e0 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20  iTo.** in order 
133f0 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68  to be certain th
13400 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69  at we got the ri
13410 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e  ght one..*/.#ifn
13420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13430 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20  AUTOVACUUM.void 
13440 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d  sqlite3RootPageM
13450 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62  oved(sqlite3 *db
13460 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69  , int iDb, int i
13470 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
13480 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
13490 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
134a0 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
134b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
134c0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
134d0 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
134e0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
134f0 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26  Db];.  pHash = &
13500 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
13510 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
13520 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
13530 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
13540 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
13550 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
13560 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
13570 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
13580 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
13590 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
135a0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
135b0 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
135c0 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
135d0 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
135e0 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
135f0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
13600 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
13610 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
13620 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
13630 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
13640 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
13650 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
13660 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
13670 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
13680 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
13690 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
136a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
136b0 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
136c0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
136d0 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
136e0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
136f0 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
13700 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
13710 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
13720 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
13730 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
13740 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
13750 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
13760 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
13770 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
13780 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
13790 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
137a0 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
137b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
137c0 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
137d0 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
137e0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
137f0 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
13800 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
13810 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13820 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
13830 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
13840 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13850 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 62  ;.  assert( iTab
13860 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 74 65  le>1 );.  sqlite
13870 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13880 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
13890 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73  e, r1, iDb);.  s
138a0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
138b0 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
138c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
138d0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
138e0 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
138f0 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
13900 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
13910 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
13920 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
13930 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
13940 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
13950 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
13960 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
13970 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
13980 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
13990 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
139a0 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
139b0 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
139c0 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68  The "#NNN" in th
139d0 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
139e0 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
139f0 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
13a00 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e  value.  ** is in
13a10 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20   register NNN.  
13a20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65  See grammar rule
13a30 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
13a40 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45  h the TK_REGISTE
13a50 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72  R.  ** token for
13a60 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
13a70 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  rmation..  */.  
13a80 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13a90 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
13aa0 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
13ab0 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
13ac0 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f  HERE #%d AND roo
13ad0 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20  tpage=#%d",.    
13ae0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
13af0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
13b00 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 54 61  MASTER_NAME, iTa
13b10 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
13b20 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
13b30 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
13b40 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
13b50 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
13b60 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
13b70 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
13b80 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
13b90 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
13ba0 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
13bb0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
13bc0 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
13bd0 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
13be0 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
13bf0 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
13c00 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
13c10 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
13c20 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
13c30 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
13c40 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
13c50 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
13c60 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
13c70 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
13c80 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
13c90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13ca0 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
13cb0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
13cc0 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
13cd0 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
13ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13cf0 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
13d00 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
13d10 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
13d20 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
13d30 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
13d40 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
13d50 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
13d60 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
13d70 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
13d80 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
13d90 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
13da0 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
13db0 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
13dc0 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
13dd0 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
13de0 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
13df0 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
13e00 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
13e10 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
13e20 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
13e30 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
13e40 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
13e50 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
13e60 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
13e70 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
13e80 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
13e90 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
13ea0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
13eb0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
13ec0 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
13ed0 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
13ee0 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
13ef0 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
13f00 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
13f10 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
13f20 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
13f30 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
13f40 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
13f50 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
13f60 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
13f70 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
13f80 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
13f90 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
13fa0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
13fb0 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
13fc0 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
13fd0 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
13fe0 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
13ff0 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
14000 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
14010 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
14020 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
14030 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
14040 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
14050 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
14060 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
14070 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
14080 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
14090 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
140a0 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
140b0 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
140c0 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
140d0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
140e0 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
140f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
14100 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
14110 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
14120 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
14130 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
14140 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
14150 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
14160 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ema);.      asse
14170 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
14180 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44  b<pParse->db->nD
14190 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  b );.      destr
141a0 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
141b0 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
141c0 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
141d0 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
141e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
141f0 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65  ** Remove entrie
14200 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
14210 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28  e_statN tables (
14220 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29  for N in (1,2,3)
14230 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f  ).** after a DRO
14240 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20  P INDEX or DROP 
14250 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TABLE command..*
14260 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
14270 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
14280 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  bles(.  Parse *p
14290 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
142a0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
142b0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
142c0 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
142d0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
142e0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f  e number */.  co
142f0 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
14300 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72       /* "idx" or
14310 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73   "tbl" */.  cons
14320 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
14330 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e     /* Name of in
14340 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a  dex or table */.
14350 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
14360 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
14370 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  e = pParse->db->
14380 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
14390 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  e;.  for(i=1; i<
143a0 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  =4; i++){.    ch
143b0 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20  ar zTab[24];.   
143c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
143d0 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a  f(sizeof(zTab),z
143e0 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74  Tab,"sqlite_stat
143f0 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20  %d",i);.    if( 
14400 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
14410 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61  (pParse->db, zTa
14420 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20  b, zDbName) ){. 
14430 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
14440 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
14450 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
14460 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
14470 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20   %s=%Q",.       
14480 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20   zDbName, zTab, 
14490 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20  zType, zName.   
144a0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
144b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
144c0 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61  e code to drop a
144d0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
144e0 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54  sqlite3CodeDropT
144f0 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
14500 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
14510 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73   int iDb, int is
14520 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76  View){.  Vdbe *v
14530 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
14540 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
14550 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
14560 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26  r;.  Db *pDb = &
14570 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
14580 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
14590 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
145a0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
145b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
145c0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
145d0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
145e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
145f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14600 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14610 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
14620 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14630 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d   OP_VBegin);.  }
14640 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
14650 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20  op all triggers 
14660 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14670 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
14680 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20  dropped. Code.  
14690 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
146a0 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
146b0 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
146c0 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a  ster and/or.  **
146d0 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73   sqlite_temp_mas
146e0 74 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e  ter if required.
146f0 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72  .  */.  pTrigger
14700 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
14710 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  rList(pParse, pT
14720 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54  ab);.  while( pT
14730 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73  rigger ){.    as
14740 73 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e  sert( pTrigger->
14750 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
14760 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20  Schema || .     
14770 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63     pTrigger->pSc
14780 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
14790 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
147a0 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
147b0 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54  erPtr(pParse, pT
147c0 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72  rigger);.    pTr
147d0 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
147e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69  ->pNext;.  }..#i
147f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14800 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
14810 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
14820 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
14830 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
14840 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
14850 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61  with.  ** the ta
14860 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
14870 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
14880 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
14890 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a   is dropped.  **
148a0 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
148b0 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
148c0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
148d0 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
148e0 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72    ** move as a r
148f0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f  esult of the dro
14900 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e  p (can happen in
14910 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
14920 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
14930 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
14940 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
14950 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   ){.    sqlite3N
14960 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
14970 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45  e,.      "DELETE
14980 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f   FROM %Q.sqlite_
14990 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e  sequence WHERE n
149a0 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70  ame=%Q",.      p
149b0 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 70 54  Db->zDbSName, pT
149c0 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ab->zName.    );
149d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
149e0 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54  * Drop all SQLIT
149f0 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61  E_MASTER table a
14a00 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  nd index entries
14a10 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
14a20 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54  he.  ** table. T
14a30 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20  he program name 
14a40 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68  loops through th
14a50 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
14a60 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20  nd deletes.  ** 
14a70 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72  every row that r
14a80 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
14a90 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
14aa0 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69  e as the one bei
14ab0 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e  ng.  ** dropped.
14ac0 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61   Triggers are ha
14ad0 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79  ndled separately
14ae0 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67   because a trigg
14af0 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63  er can be.  ** c
14b00 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65  reated in the te
14b10 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74  mp database that
14b20 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
14b30 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20  le in another.  
14b40 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ** database..  *
14b50 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
14b60 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
14b70 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
14b80 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74  OM %Q.%s WHERE t
14b90 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74  bl_name=%Q and t
14ba0 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
14bb0 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53  .      pDb->zDbS
14bc0 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d  Name, MASTER_NAM
14bd0 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  E, pTab->zName);
14be0 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26  .  if( !isView &
14bf0 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
14c00 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  b) ){.    destro
14c10 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  yTable(pParse, p
14c20 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tab);.  }..  /* 
14c30 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  Remove the table
14c40 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69   entry from SQLi
14c50 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63  te's internal sc
14c60 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a  hema and modify.
14c70 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
14c80 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69  cookie..  */.  i
14c90 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
14ca0 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
14cb0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14cc0 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c  P_VDestroy, iDb,
14cd0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
14ce0 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  me, 0);.  }.  sq
14cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14d00 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
14d10 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
14d20 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73  ->zName, 0);.  s
14d30 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
14d40 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
14d50 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
14d60 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
14d70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
14d80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
14d90 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f  to do the work o
14da0 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73  f a DROP TABLE s
14db0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61  tatement..** pNa
14dc0 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
14dd0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
14de0 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f  e dropped..*/.vo
14df0 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  id sqlite3DropTa
14e00 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
14e10 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
14e20 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69  e, int isView, i
14e30 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62  nt noErr){.  Tab
14e40 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65  le *pTab;.  Vdbe
14e50 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
14e60 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14e70 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
14e80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14e90 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
14ea0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14eb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14ec0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
14ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  ;.  assert( pNam
14ee0 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
14ef0 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53  if( sqlite3ReadS
14f00 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
14f10 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14f20 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72  able;.  if( noEr
14f30 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r ) db->suppress
14f40 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  Err++;.  assert(
14f50 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73   isView==0 || is
14f60 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 49 45  View==LOCATE_VIE
14f70 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  W );.  pTab = sq
14f80 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
14f90 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56  Item(pParse, isV
14fa0 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30  iew, &pName->a[0
14fb0 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20  ]);.  if( noErr 
14fc0 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  ) db->suppressEr
14fd0 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  r--;..  if( pTab
14fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
14ff0 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f  oErr ) sqlite3Co
15000 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
15010 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
15020 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
15030 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
15040 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
15050 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
15060 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
15070 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
15080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
15090 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
150a0 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Db );..  /* If p
150b0 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c  Tab is a virtual
150c0 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65   table, call Vie
150d0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
150e0 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a  ) to ensure.  **
150f0 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   it is initializ
15100 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ed..  */.  if( I
15110 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26  sVirtual(pTab) &
15120 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  & sqlite3ViewGet
15130 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15140 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20  se, pTab) ){.   
15150 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
15160 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64  table;.  }.#ifnd
15170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15180 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
15190 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
151a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
151b0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
151c0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e  LE(iDb);.    con
151d0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
151e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
151f0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
15200 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
15210 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15220 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15230 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
15240 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
15250 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15260 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
15270 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
15280 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
15290 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
152a0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
152b0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
152c0 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
152d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
152e0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
152f0 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
15300 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
15310 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15320 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
15330 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
15340 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
15350 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
15360 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
15370 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rg2 = sqlite3Get
15380 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
15390 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
153a0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
153b0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
153c0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
153d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
153e0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
153f0 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
15400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15410 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
15420 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
15430 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15440 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
15450 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
15460 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
15470 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
15480 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
15490 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
154a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
154b0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
154c0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
154d0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
154e0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
154f0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
15510 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
15520 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
15530 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
15540 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73   7)==0 .    && s
15550 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
15560 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
15570 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d  ite_stat", 11)!=
15580 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
15590 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
155a0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
155b0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
155c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
155d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
155e0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
155f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15600 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
15610 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
15620 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
15630 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
15640 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
15650 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
15660 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
15670 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
15680 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
15690 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
156a0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
156b0 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
156c0 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
156d0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
156e0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
156f0 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
15700 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
15710 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
15720 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
15730 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
15740 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
15750 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
15760 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
15770 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
15780 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
15790 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
157a0 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
157b0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
157c0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
157d0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
157e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
157f0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
15800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
15810 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
15820 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
15830 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
15840 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ew ){.      sqli
15850 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
15860 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
15870 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  "tbl", pTab->zNa
15880 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
15890 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50  e3FkDropTable(pP
158a0 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61  arse, pName, pTa
158b0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  b);.    }.    sq
158c0 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62  lite3CodeDropTab
158d0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
158e0 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20   iDb, isView);. 
158f0 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61   }..exit_drop_ta
15900 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  ble:.  sqlite3Sr
15910 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
15920 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
15930 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15940 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
15950 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20  e a new foreign 
15960 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  key on the table
15970 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
15980 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
15990 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65  .  pFromCol dete
159a0 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c  rmines which col
159b0 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63  umns.** in the c
159c0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69  urrent table poi
159d0 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67  nt to the foreig
159e0 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d  n key.  If pFrom
159f0 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63  Col==0 then.** c
15a00 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74  onnect the key t
15a10 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  o the last colum
15a20 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f  n inserted.  pTo
15a30 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a   is the name of.
15a40 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65 66  ** the table ref
15a50 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20  erred to (a.k.a 
15a60 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61 62  the "parent" tab
15a70 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20  le).  pToCol is 
15a80 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62  a list.** of tab
15a90 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  les in the paren
15aa0 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c  t pTo table.  fl
15ab0 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
15ac0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
15ad0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
15ae0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
15af0 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
15b00 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
15b10 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
15b20 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
15b30 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
15b40 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
15b50 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
15b60 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
15b70 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
15b80 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
15b90 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
15ba0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
15bb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
15bc0 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
15bd0 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
15be0 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
15bf0 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
15c00 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
15c10 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
15c20 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
15c30 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
15c40 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
15c50 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
15c60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15c70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15c80 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
15c90 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
15ca0 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
15cb0 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
15cc0 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
15cd0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
15ce0 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
15cf0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
15d00 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
15d10 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
15d20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
15d30 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
15d40 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
15d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
15d60 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
15d70 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
15d80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15d90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
15da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15db0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
15dc0 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
15dd0 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54  ;.  FKey *pNextT
15de0 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  o;.  Table *p = 
15df0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
15e00 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  e;.  int nByte;.
15e10 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
15e20 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  Col;.  char *z;.
15e30 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d  .  assert( pTo!=
15e40 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  0 );.  if( p==0 
15e50 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
15e60 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
15e70 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
15e80 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
15e90 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
15ea0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
15eb0 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
15ec0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
15ed0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
15ee0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
15ef0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
15f00 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
15f10 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
15f20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
15f30 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
15f40 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
15f50 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
15f60 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
15f70 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
15f80 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
15f90 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
15fa0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
15fb0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
15fc0 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
15fd0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
15fe0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15ff0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
16000 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
16010 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
16020 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
16030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
16040 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
16050 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
16060 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
16070 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
16080 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
16090 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
160a0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
160b0 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
160c0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
160d0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
160e0 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
160f0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
16100 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
16110 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
16120 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
16130 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
16140 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
16150 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
16160 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
16170 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
16180 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
16190 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
161a0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
161b0 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
161c0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
161d0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
161e0 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
161f0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
16200 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
16210 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 69  ey->zTo = z;.  i
16220 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
16230 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ECT ){.    sqlit
16240 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
16250 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
16260 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 6d  z, pTo);.  }.  m
16270 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
16280 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
16290 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
162a0 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
162b0 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
162c0 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
162d0 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
162e0 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
162f0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
16300 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
16310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
16320 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
16330 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
16340 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
16350 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
16360 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
16370 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
16380 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
16390 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
163a0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
163b0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
163c0 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
163d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
163e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
163f0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
16400 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
16410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16420 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
16430 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
16440 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
16450 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
16460 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
16470 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
16480 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
16490 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
164a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
164b0 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
164c0 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CT ){.        sq
164d0 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
164e0 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 26 70  Remap(pParse, &p
164f0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c 20 70  FKey->aCol[i], p
16500 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
16510 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
16520 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54    }.  }.  if( pT
16530 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
16540 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
16550 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
16560 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
16570 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  (pToCol->a[i].zN
16580 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65  ame);.      pFKe
16590 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20  y->aCol[i].zCol 
165a0 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 49  = z;.      if( I
165b0 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
165c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
165d0 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
165e0 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 70 54  ap(pParse, z, pT
165f0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
16600 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16610 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f   memcpy(z, pToCo
16620 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e  l->a[i].zName, n
16630 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20  );.      z[n] = 
16640 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b  0;.      z += n+
16650 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
16660 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
16670 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61   = 0;.  pFKey->a
16680 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29  Action[0] = (u8)
16690 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 3b 20  (flags & 0xff); 
166a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e             /* ON
166b0 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a   DELETE action *
166c0 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  /.  pFKey->aActi
166d0 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 66 6c  on[1] = (u8)((fl
166e0 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 78 66  ags >> 8 ) & 0xf
166f0 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44  f);    /* ON UPD
16700 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20  ATE action */.. 
16710 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16720 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
16730 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d  db, 0, p->pSchem
16740 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20  a) );.  pNextTo 
16750 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 74 65  = (FKey *)sqlite
16760 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e  3HashInsert(&p->
16770 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73  pSchema->fkeyHas
16780 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  h, .      pFKey-
16790 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 70 46  >zTo, (void *)pF
167a0 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 70  Key.  );.  if( p
167b0 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 29 7b  NextTo==pFKey ){
167c0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46  .    sqlite3OomF
167d0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 67 6f  ault(db);.    go
167e0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
167f0 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 7b 0a   if( pNextTo ){.
16800 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 78      assert( pNex
16810 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d 30 20  tTo->pPrevTo==0 
16820 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 70 4e  );.    pFKey->pN
16830 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 6f 3b  extTo = pNextTo;
16840 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e 70 50  .    pNextTo->pP
16850 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b 0a 20  revTo = pFKey;. 
16860 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
16870 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f  e foreign key to
16880 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 74 68   the table as th
16890 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a  e last step..  *
168a0 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70  /.  p->pFKey = p
168b0 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20  FKey;.  pFKey = 
168c0 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71  0;..fk_end:.  sq
168d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
168e0 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f  pFKey);.#endif /
168f0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
16900 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
16910 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  EY) */.  sqlite3
16920 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
16930 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  b, pFromCol);.  
16940 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
16950 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c  elete(db, pToCol
16960 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
16970 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16980 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49  ed when an INITI
16990 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f  ALLY IMMEDIATE o
169a0 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
169b0 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69  RRED.** clause i
169c0 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f  s seen as part o
169d0 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  f a foreign key 
169e0 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65  definition.  The
169f0 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70   isDeferred.** p
16a00 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f  arameter is 1 fo
16a10 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  r INITIALLY DEFE
16a20 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49  RRED and 0 for I
16a30 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
16a40 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76  TE..** The behav
16a50 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ior of the most 
16a60 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
16a70 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
16a80 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f  adjusted.** acco
16a90 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  rdingly..*/.void
16aa0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
16ab0 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70  eignKey(Parse *p
16ac0 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66  Parse, int isDef
16ad0 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20  erred){.#ifndef 
16ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
16af0 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20  IGN_KEY.  Table 
16b00 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70  *pTab;.  FKey *p
16b10 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61  FKey;.  if( (pTa
16b20 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
16b30 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46  Table)==0 || (pF
16b40 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65  Key = pTab->pFKe
16b50 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  y)==0 ) return;.
16b60 20 20 61 73 73 65 72 74 28 20 69 73 44 65 66 65    assert( isDefe
16b70 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66  rred==0 || isDef
16b80 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a 20 45  erred==1 ); /* E
16b90 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 31 37  V: R-30323-21917
16ba0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   */.  pFKey->isD
16bb0 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
16bc0 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
16bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16be0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
16bf0 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
16c00 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
16c10 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
16c20 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
16c30 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
16c40 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
16c50 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
16c60 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
16c70 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
16c80 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
16c90 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
16ca0 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
16cb0 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
16cc0 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
16cd0 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
16ce0 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
16cf0 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
16d00 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
16d10 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
16d20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16d30 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
16d40 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
16d50 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
16d60 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
16d70 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
16d80 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
16d90 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
16da0 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
16db0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
16dc0 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
16dd0 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
16de0 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
16df0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
16e00 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
16e10 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
16e20 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
16e30 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
16e40 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
16e50 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
16e60 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
16e70 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
16e80 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
16e90 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
16ea0 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
16eb0 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
16ec0 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
16ed0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
16ee0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
16ef0 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
16f00 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 3b 20  .  int iSorter; 
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
16f30 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 65 72  ed by OpenSorter
16f40 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a 2f 0a   (if in use) */.
16f50 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16f80 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
16f90 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 20 20  int addr2;      
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fb0 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a 75 6d  * Address to jum
16fc0 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 69 74  p to for next it
16fd0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
16fe0 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20   tnum;          
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17000 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e 64 65  oot page of inde
17010 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 74  x */.  int iPart
17020 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 20 20  IdxLabel;       
17030 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f        /* Jump to
17040 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f 20 73   this label to s
17050 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 20 56  kip a row */.  V
17060 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17080 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
17090 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
170a0 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
170b0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170d0 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
170e0 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  x */.  int regRe
170f0 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 20 20  cord;           
17100 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
17110 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 6d 62  r holding assemb
17120 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  led index record
17130 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
17140 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
17150 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
17160 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
17170 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73  */.  int iDb = s
17180 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
17190 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e  dex(db, pIndex->
171a0 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64  pSchema);..#ifnd
171b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
171c0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
171d0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
171e0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
171f0 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 6e 64  TE_REINDEX, pInd
17200 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20  ex->zName, 0,.  
17210 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
17220 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b 0a 20  .zDbSName ) ){. 
17230 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
17240 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
17250 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
17260 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
17270 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
17280 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
17290 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
172a0 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
172b0 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
172c0 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
172d0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
172e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
172f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
17300 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
17310 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
17320 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
17330 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
17340 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
17350 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
17360 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
17370 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
17380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
17390 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !=0 || db->mallo
173a0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
173b0 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 2f 2a  e->nErr );..  /*
173c0 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
173d0 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
173e0 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
173f0 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
17400 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
17410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17420 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
17430 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
17440 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
17450 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
17460 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
17470 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
17480 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
17490 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
174a0 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
174b0 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
174c0 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
174d0 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
174e0 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
174f0 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
17500 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
17510 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
17520 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
17530 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
17540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17550 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
17560 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
17570 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
17580 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
17590 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
175a0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 75  se);.  sqlite3Mu
175b0 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 65 29  ltiWrite(pParse)
175c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
175d0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
175e0 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
175f0 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
17600 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
17610 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17620 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
17630 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
17640 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
17650 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
17660 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
17670 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
17680 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17690 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
176a0 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
176b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
176c0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
176d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
176e0 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
176f0 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
17700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17710 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
17720 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
17730 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
17740 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
17750 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
17780 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
17790 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
177a0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
177b0 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
177c0 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
177d0 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
177e0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
177f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
17800 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
17810 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
17820 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 73 55  ge(v);.  if( IsU
17830 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65  niqueIndex(pInde
17840 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  x) ){.    int j2
17850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f   = sqlite3VdbeGo
17860 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 61 64  to(v, 1);.    ad
17870 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
17880 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
17890 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
178a0 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c 65 28  VerifyAbortable(
178b0 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20  v, OE_Abort);.  
178c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
178d0 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72  Op4Int(v, OP_Sor
178e0 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72  terCompare, iSor
178f0 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f  ter, j2, regReco
17900 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
17920 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56  dex->nKeyCol); V
17930 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17940 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
17950 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
17960 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49  se, OE_Abort, pI
17970 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
17980 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17990 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , j2);.  }else{.
179a0 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
179b0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
179c0 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
179d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
179e0 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
179f0 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
17a00 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ord, iIdx);.  sq
17a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17a20 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 20 69  v, OP_SeekEnd, i
17a30 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Idx);.  sqlite3V
17a40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17a50 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
17a60 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
17a70 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17a80 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
17a90 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73  SEEKRESULT);.  s
17aa0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
17ab0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
17ac0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
17ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17ae0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
17af0 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20  Sorter, addr2); 
17b00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
17b10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
17b20 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
17b30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
17b40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
17b50 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c  se, iTab);.  sql
17b60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17b70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78  , OP_Close, iIdx
17b80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17b90 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
17ba0 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a  se, iSorter);.}.
17bb0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
17bc0 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f  heap space to ho
17bd0 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ld an Index obje
17be0 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c  ct with nCol col
17bf0 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72  umns..**.** Incr
17c00 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  ease the allocat
17c10 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76  ion size to prov
17c20 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78  ide an extra nEx
17c30 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  tra bytes.** of 
17c40 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73  8-byte aligned s
17c50 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
17c60 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20  ndex object and 
17c70 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  return a.** poin
17c80 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72  ter to this extr
17c90 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78  a space in *ppEx
17ca0 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  tra..*/.Index *s
17cb0 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
17cc0 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c  dexObject(.  sql
17cd0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
17ce0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
17cf0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31  nnection */.  i1
17d00 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  6 nCol,         
17d10 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
17d20 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
17d30 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
17d40 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
17d50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17d60 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61  f bytes of extra
17d70 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20   space to alloc 
17d80 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78  */.  char **ppEx
17d90 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tra       /* Poi
17da0 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74  nter to the "ext
17db0 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a  ra" space */.){.
17dc0 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20    Index *p;     
17dd0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
17de0 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ted index object
17df0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
17e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
17e10 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
17e20 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20   Index object + 
17e30 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79  arrays */..  nBy
17e40 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
17e50 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20  of(Index)) +    
17e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17e70 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
17e80 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44  .          ROUND
17e90 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
17ea0 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20  nCol) +         
17eb0 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
17ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17ed0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c   ROUND8(sizeof(L
17ee0 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  ogEst)*(nCol+1) 
17ef0 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61  +     /* Index.a
17f00 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a  iRowLogEst   */.
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
17f30 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f  l +            /
17f40 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
17f50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17f60 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38         sizeof(u8
17f70 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20  )*nCol);        
17f80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
17f90 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20  ortOrder */.  p 
17fa0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
17fb0 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
17fc0 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
17fd0 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a   p ){.    char *
17fe0 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
17ff0 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)+ROUND8(sizeo
18000 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70  f(Index));.    p
18010 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73  ->azColl = (cons
18020 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b  t char**)pExtra;
18030 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44   pExtra += ROUND
18040 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  8(sizeof(char*)*
18050 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69  nCol);.    p->ai
18060 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67  RowLogEst = (Log
18070 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78  Est*)pExtra; pEx
18080 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  tra += sizeof(Lo
18090 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a  gEst)*(nCol+1);.
180a0 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20      p->aiColumn 
180b0 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20  = (i16*)pExtra; 
180c0 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
180d0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
180e0 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  ;.    p->aSortOr
180f0 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72  der = (u8*)pExtr
18100 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d  a;.    p->nColum
18110 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = nCol;.    p-
18120 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20  >nKeyCol = nCol 
18130 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72  - 1;.    *ppExtr
18140 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b  a = ((char*)p) +
18150 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
18160 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
18170 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
18180 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
18190 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
181a0 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
181b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
181c0 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
181d0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
181e0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
181f0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
18200 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
18210 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
18220 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
18230 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
18240 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
18250 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
18260 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
18270 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
18280 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
18290 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
182a0 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
182b0 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
182c0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
182d0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
182e0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
182f0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
18300 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
18310 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
18320 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
18330 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
18340 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
18350 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
18360 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
18370 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
18380 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
18390 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
183a0 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
183b0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
183c0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
183d0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
183e0 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
183f0 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20  e3CreateIndex(. 
18400 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18410 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72      /* All infor
18420 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69  mation about thi
18430 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b  s parse */.  Tok
18440 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
18450 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
18460 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
18470 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   be NULL */.  To
18480 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
18490 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
184a0 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d  of index name. M
184b0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
184c0 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d  SrcList *pTblNam
184d0 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69  e, /* Table to i
184e0 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73 65  ndex. Use pParse
184f0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30  ->pNewTable if 0
18500 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
18510 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69  pList,   /* A li
18520 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
18530 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
18540 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
18550 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c      /* OE_Abort,
18560 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52   OE_Ignore, OE_R
18570 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f  eplace, or OE_No
18580 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ne */.  Token *p
18590 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68  Start,     /* Th
185a0 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
185b0 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73 20  hat begins this 
185c0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  statement */.  E
185d0 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20  xpr *pPIWhere,  
185e0 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
185f0 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e  e for partial in
18600 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73  dices */.  int s
18610 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a  ortOrder,     /*
18620 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70   Sort order of p
18630 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20  rimary key when 
18640 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20  pList==NULL */. 
18650 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 2c   int ifNotExist,
18660 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f      /* Omit erro
18670 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61  r if index alrea
18680 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 75  dy exists */.  u
18690 38 20 69 64 78 54 79 70 65 20 20 20 20 20 20 20  8 idxType       
186a0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
186b0 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ype */.){.  Tabl
186c0 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
186d0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
186e0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
186f0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
18700 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
18710 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
18720 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
18730 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0;     /* Name o
18740 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
18750 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
18760 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18770 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
18780 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20   zName */.  int 
18790 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20  i, j;.  DbFixer 
187a0 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
187b0 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
187c0 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
187d0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
187e0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
187f0 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
18800 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
18810 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
18820 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
18830 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
18840 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
18850 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
18860 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
18870 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
18880 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
18890 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
188a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
188b0 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
188c0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
188d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
188e0 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
188f0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
18900 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
18910 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
18920 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
18930 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
18940 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
18950 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
18960 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20  Extra = 0;      
18970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18980 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
18990 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20  or zExtra[] */. 
189a0 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20   int nExtraCol; 
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
189d0 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65  xtra columns nee
189e0 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ded */.  char *z
189f0 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20  Extra = 0;      
18a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
18a10 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ra space after t
18a20 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
18a30 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20  */.  Index *pPk 
18a40 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49  = 0;      /* PRI
18a50 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66  MARY KEY index f
18a60 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
18a70 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 69 66   tables */..  if
18a80 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
18a90 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
18aa0 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rr>0 ){.    goto
18ab0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18ac0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 4e  ex;.  }.  if( IN
18ad0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 26 26  _DECLARE_VTAB &&
18ae0 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45   idxType!=SQLITE
18af0 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
18b00 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  KEY ){.    goto 
18b10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18b20 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  x;.  }.  if( SQL
18b30 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
18b40 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
18b50 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
18b60 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18b70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
18b80 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
18b90 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
18ba0 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
18bb0 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
18bc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
18bd0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
18be0 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
18bf0 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
18c00 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
18c10 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
18c20 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
18c30 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
18c40 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
18c50 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
18c60 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
18c70 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
18c80 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18c90 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
18ca0 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
18cb0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
18cc0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
18cd0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
18ce0 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
18cf0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
18d00 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18d10 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26  assert( pName &&
18d20 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69   pName->z );..#i
18d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18d40 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
18d50 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
18d60 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
18d70 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
18d80 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
18d90 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
18da0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
18db0 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
18dc0 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
18dd0 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
18de0 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
18df0 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
18e00 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
18e10 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
18e20 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
18e30 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
18e40 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
18e50 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d   if( pName2->n==
18e60 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
18e70 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
18e80 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
18e90 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  {.        iDb = 
18ea0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18eb0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c  .#endif..    sql
18ec0 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
18ed0 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
18ee0 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b  "index", pName);
18ef0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18f00 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
18f10 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20  , pTblName) ){. 
18f20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
18f30 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74  the parser const
18f40 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66  ructs pTblName f
18f50 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65  rom a single ide
18f60 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a  ntifier,.      *
18f70 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
18f80 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ist can never fa
18f90 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  il. */.      ass
18fa0 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
18fb0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
18fc0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
18fd0 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c  pParse, 0, &pTbl
18fe0 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20  Name->a[0]);.   
18ff0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
19000 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
19010 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  pTab==0 );.    i
19020 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
19030 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19040 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62  dex;.    if( iDb
19050 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69  ==1 && db->aDb[i
19060 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61  Db].pSchema!=pTa
19070 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
19080 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
19090 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
190a0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
190b0 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e  create a TEMP in
190c0 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20  dex on non-TEMP 
190d0 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20  table \"%s\"",. 
190e0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
190f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
19100 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19110 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
19120 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
19130 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69  ab) ) pPk = sqli
19140 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
19150 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ex(pTab);.  }els
19160 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
19170 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Name==0 );.    a
19180 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30  ssert( pStart==0
19190 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
191a0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
191b0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
191c0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
191d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
191e0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
191f0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
19200 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
19210 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
19220 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72  b[iDb];..  asser
19230 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
19240 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19250 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
19260 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
19270 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
19280 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
19290 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e 69 6e         && db->in
192a0 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 20 53  it.busy==0.#if S
192b0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
192c0 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20  NTICATION.      
192d0 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41   && sqlite3UserA
192e0 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a  uthTable(pTab->z
192f0 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a  Name)==0.#endif.
19300 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c  #ifdef SQLITE_AL
19310 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45  LOW_SQLITE_MASTE
19320 52 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26  R_INDEX.       &
19330 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
19340 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
19350 2c 22 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65  ,"master")!=0.#e
19360 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 20 73  ndif.       && s
19370 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26  qlite3StrNICmp(&
19380 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
19390 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30  altertab_",9)!=0
193a0 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  . ){.    sqlite3
193b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
193c0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
193d0 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
193e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
193f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19400 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
19410 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19420 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
19430 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
19440 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
19450 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
19460 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
19470 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
19480 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19490 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
194a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
194b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
194c0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
194d0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
194e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
194f0 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
19500 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
19510 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
19520 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
19530 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
19540 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
19550 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
19560 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
19570 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
19580 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
19590 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
195a0 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
195b0 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
195c0 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
195d0 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
195e0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
195f0 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
19600 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
19610 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
19620 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
19630 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
19640 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
19650 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
19660 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
19670 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
19680 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
19690 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
196a0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
196b0 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
196c0 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
196d0 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
196e0 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
196f0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
19700 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
19710 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
19720 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
19730 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
19740 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
19750 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
19760 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
19770 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
19780 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
19790 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
197a0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
197b0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
197c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
197d0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
197e0 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  >z!=0 );.    if(
197f0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
19800 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
19810 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
19820 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
19830 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
19840 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
19850 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
19860 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
19870 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
19880 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
19890 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
198a0 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
198b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
198c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
198d0 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
198e0 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e  lready a table n
198f0 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29  amed %s", zName)
19900 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
19910 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19920 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ex;.        }.  
19930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19940 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
19950 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
19960 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 7b  >zDbSName)!=0 ){
19970 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69 66  .        if( !if
19980 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20  NotExist ){.    
19990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
199a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
199b0 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
199c0 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
199d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
199e0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
199f0 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
19a00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
19a10 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
19a20 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
19a30 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
19a40 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19a50 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19a60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
19a70 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
19a80 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
19a90 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
19aa0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
19ab0 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
19ac0 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
19ad0 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
19ae0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
19af0 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
19b00 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
19b10 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
19b20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
19b30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19b40 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19b50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
19b60 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
19b70 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 20 66  ames generated f
19b80 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c 69 74  rom within sqlit
19b90 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
19ba0 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 68 61  ).    ** must ha
19bb0 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72  ve names that ar
19bc0 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  e distinct from 
19bd0 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 69 63  normal automatic
19be0 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a 20 20   index names..  
19bf0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
19c00 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  ng statement con
19c10 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 5f 61  verts "sqlite3_a
19c20 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 6e 74  utoindex..." int
19c30 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 74 65  o.    ** "sqlite
19c40 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20  3_butoindex..." 
19c50 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
19c60 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 74 69   the names disti
19c70 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  nct..    ** The 
19c80 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 22 20  "vtab_err.test" 
19c90 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 74 65  test demonstrate
19ca0 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 74 68  s the need of th
19cb0 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f  is statement. */
19cc0 0a 20 20 20 20 69 66 28 20 49 4e 5f 53 50 45 43  .    if( IN_SPEC
19cd0 49 41 4c 5f 50 41 52 53 45 20 29 20 7a 4e 61 6d  IAL_PARSE ) zNam
19ce0 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  e[7]++;.  }..  /
19cf0 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
19d00 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
19d10 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
19d20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
19d30 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
19d40 54 49 4f 4e 0a 20 20 69 66 28 20 21 49 4e 5f 52  TION.  if( !IN_R
19d50 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
19d60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
19d70 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 53 4e  zDb = pDb->zDbSN
19d80 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
19d90 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19da0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
19db0 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
19dc0 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20  E(iDb), 0, zDb) 
19dd0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19de0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19df0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53  .    }.    i = S
19e00 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44  QLITE_CREATE_IND
19e10 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  EX;.    if( !OMI
19e20 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
19e30 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f  =1 ) i = SQLITE_
19e40 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
19e50 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
19e60 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
19e70 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54  se, i, zName, pT
19e80 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20  ab->zName, zDb) 
19e90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
19ea0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19eb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
19ec0 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74  f..  /* If pList
19ed0 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ==0, it means th
19ee0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
19ef0 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20  alled to make a 
19f00 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79  primary.  ** key
19f10 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74   out of the last
19f20 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f   column added to
19f30 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72   the table under
19f40 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20   construction.. 
19f50 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20   ** So create a 
19f60 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d  fake list to sim
19f70 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f  ulate this..  */
19f80 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
19f90 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 72 65  ){.    Token pre
19fa0 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  vCol;.    Column
19fb0 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e   *pCol = &pTab->
19fc0 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
19fd0 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f  1];.    pCol->co
19fe0 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
19ff0 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 73 71  G_UNIQUE;.    sq
1a000 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
1a010 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d 3e 7a  prevCol, pCol->z
1a020 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
1a030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1a040 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1a050 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1a060 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
1a070 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70  oc(db, TK_ID, &p
1a080 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20  revCol, 0));.   
1a090 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1a0a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a0b0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
1a0c0 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
1a0d0 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
1a0e0 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
1a0f0 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f  tOrder(pList, so
1a100 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73  rtOrder);.  }els
1a110 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1a120 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
1a130 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  h(pParse, pList,
1a140 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a   "index");.  }..
1a150 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1a160 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
1a170 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
1a180 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
1a190 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
1a1a0 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
1a1b0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
1a1c0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1a1d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1a1e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
1a1f0 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
1a200 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
1a210 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
1a220 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  0 );.    if( pEx
1a230 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
1a240 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  TE ){.      nExt
1a250 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
1a260 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
1a270 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
1a280 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
1a290 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
1a2a0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
1a2b0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
1a2c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1a2d0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
1a2e0 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
1a2f0 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
1a300 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1a310 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
1a320 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
1a330 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
1a340 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20            nName 
1a370 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
1a380 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
1a390 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a3a0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1a3b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a3c0 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
1a3d0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1a3e0 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
1a3f0 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
1a400 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1a410 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
1a420 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
1a430 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
1a440 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
1a450 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
1a460 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
1a470 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
1a480 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
1a490 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
1a4a0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
1a4b0 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
1a4c0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1a4d0 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
1a4e0 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
1a4f0 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78  x->idxType = idx
1a500 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  Type;.  pIndex->
1a510 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
1a520 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
1a530 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
1a540 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
1a550 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
1a560 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
1a570 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
1a580 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
1a590 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
1a5a0 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
1a5b0 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
1a5c0 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
1a5d0 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
1a5e0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
1a5f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1a600 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1a610 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
1a620 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
1a630 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
1a640 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
1a650 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
1a660 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
1a670 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
1a680 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
1a690 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
1a6a0 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
1a6b0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1a6c0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
1a6d0 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
1a6e0 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
1a6f0 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69  * Analyze the li
1a700 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
1a710 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
1a720 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64  terms of the ind
1a730 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f  ex and.  ** repo
1a740 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20  rt any errors.  
1a750 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  In the common ca
1a760 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78 70  se where the exp
1a770 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74  ression is exact
1a780 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20  ly.  ** a table 
1a790 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68  column, store th
1a7a0 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43  at column in aiC
1a7b0 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65  olumn[].  For ge
1a7c0 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  neral expression
1a7d0 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  s,.  ** populate
1a7e0 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1a7f0 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45  r and store XN_E
1a800 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f  XPR (-2) in aiCo
1a810 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  lumn[]..  **.  *
1a820 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20  * TODO: Issue a 
1a830 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f  warning if two o
1a840 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
1a850 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65 20  f the index are 
1a860 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20  identical..  ** 
1a870 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
1a880 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61 62  rning if the tab
1a890 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  le primary key i
1a8a0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
1a8b0 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  f the.  ** index
1a8c0 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69   key..  */.  pLi
1a8d0 73 74 49 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e  stItem = pList->
1a8e0 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  a;.  if( IN_RENA
1a8f0 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
1a900 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
1a910 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70  r = pList;.    p
1a920 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  List = 0;.  }.  
1a930 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
1a940 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c  x->nKeyCol; i++,
1a950 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
1a960 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b     Expr *pCExpr;
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e    /* The i-th in
1a990 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  dex expression *
1a9a0 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  /.    int reques
1a9b0 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20  tedSortOrder;   
1a9c0 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44       /* ASC or D
1a9d0 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  ESC on the i-th 
1a9e0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a9f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1aa00 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
1aa10 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
1aa20 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
1aa30 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
1aa40 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d  gToId(pListItem-
1aa50 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c  >pExpr);.    sql
1aa60 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
1aa70 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
1aa80 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70   pTab, NC_IdxExp
1aa90 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  r, pListItem->pE
1aaa0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  xpr, 0);.    if(
1aab0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
1aac0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1aad0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78  _index;.    pCEx
1aae0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1aaf0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73  SkipCollate(pLis
1ab00 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  tItem->pExpr);. 
1ab10 20 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f     if( pCExpr->o
1ab20 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
1ab30 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1ab40 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1ab50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1ab60 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ab70 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e  rse, "expression
1ab80 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
1ab90 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1aba0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abc0 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72    "UNIQUE constr
1abd0 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20  aints");.       
1abe0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1abf0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1ac00 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65  .      if( pInde
1ac10 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29  x->aColExpr==0 )
1ac20 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1ac30 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69  ->aColExpr = pLi
1ac40 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  st;.        pLis
1ac50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1ac60 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52       j = XN_EXPR
1ac70 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  ;.      pIndex->
1ac80 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e  aiColumn[i] = XN
1ac90 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1aca0 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  dex->uniqNotNull
1acb0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1acc0 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70  .      j = pCExp
1acd0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
1ace0 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37    assert( j<=0x7
1acf0 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  fff );.      if(
1ad00 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j<0 ){.        
1ad10 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  j = pTab->iPKey;
1ad20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ad30 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
1ad40 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  otNull==0 ){.   
1ad50 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69       pIndex->uni
1ad60 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
1ad70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1ad80 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1ad90 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a  = (i16)j;.    }.
1ada0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20      zColl = 0;. 
1adb0 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
1adc0 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1add0 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20  COLLATE ){.     
1ade0 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20   int nColl;.    
1adf0 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49    zColl = pListI
1ae00 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54  tem->pExpr->u.zT
1ae10 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c  oken;.      nCol
1ae20 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
1ae30 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a  n30(zColl) + 1;.
1ae40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45        assert( nE
1ae50 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20  xtra>=nColl );. 
1ae60 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74       memcpy(zExt
1ae70 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c  ra, zColl, nColl
1ae80 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
1ae90 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a   zExtra;.      z
1aea0 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a  Extra += nColl;.
1aeb0 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20        nExtra -= 
1aec0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  nColl;.    }else
1aed0 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20   if( j>=0 ){.   
1aee0 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d     zColl = pTab-
1aef0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a  >aCol[j].zColl;.
1af00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a      }.    if( !z
1af10 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73  Coll ) zColl = s
1af20 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1af30 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
1af40 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
1af50 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
1af60 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
1af70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
1af80 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1af90 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
1afa0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
1afb0 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
1afc0 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
1afd0 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
1afe0 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
1aff0 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
1b000 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1b010 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
1b020 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
1b030 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61  /* Append the ta
1b040 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65  ble key to the e
1b050 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  nd of the index.
1b060 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f    For WITHOUT RO
1b070 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  WID.  ** tables 
1b080 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68  (when pPk!=0) th
1b090 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
1b0a0 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20  eclared PRIMARY 
1b0b0 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e  KEY.  For.  ** n
1b0c0 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68  ormal tables (wh
1b0d0 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20  en pPk==0) this 
1b0e0 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69  will be the rowi
1b0f0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1b100 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  k ){.    for(j=0
1b110 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  ; j<pPk->nKeyCol
1b120 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; j++){.      in
1b130 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  t x = pPk->aiCol
1b140 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  umn[j];.      as
1b150 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
1b160 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
1b170 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
1b180 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
1b190 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
1b1a0 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
1b1b0 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
1b1c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
1b1d0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1b1e0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
1b1f0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1b200 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
1b210 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1b220 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1b230 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
1b240 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
1b250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b260 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
1b270 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
1b280 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b290 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1b2a0 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  i] = XN_ROWID;. 
1b2b0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
1b2c0 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74  l[i] = sqlite3St
1b2d0 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73  rBINARY;.  }.  s
1b2e0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1b2f0 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
1b300 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
1b310 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
1b320 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
1b330 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  dex);..  /* If t
1b340 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 61 69  his index contai
1b350 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  ns every column 
1b360 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 74 68  of its table, th
1b370 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20  en mark.  ** it 
1b380 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
1b390 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
1b3a0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1b3b0 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e  .      || pTab->
1b3c0 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74  iPKey<0 || sqlit
1b3d0 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
1b3e0 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e 69 50  pIndex, pTab->iP
1b3f0 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 65 63  Key)>=0 );.  rec
1b400 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74  omputeColumnsNot
1b410 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 29 3b  Indexed(pIndex);
1b420 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
1b430 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e 6e 43  =0 && pIndex->nC
1b440 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e 43 6f  olumn>=pTab->nCo
1b450 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d  l ){.    pIndex-
1b460 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
1b470 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1b480 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1b490 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  {.      if( j==p
1b4a0 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 6f 6e  Tab->iPKey ) con
1b4b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1b4c0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
1b4d0 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a 29 3e  Index(pIndex,j)>
1b4e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1b4f0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 73 43       pIndex->isC
1b500 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 20 20  overing = 0;.   
1b510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b520 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 62 3d    }..  if( pTab=
1b530 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62  =pParse->pNewTab
1b540 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  le ){.    /* Thi
1b550 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65  s routine has be
1b560 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  en called to cre
1b570 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ate an automatic
1b580 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20   index as a.    
1b590 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50  ** result of a P
1b5a0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1b5b0 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61  IQUE clause on a
1b5c0 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69   column definiti
1b5d0 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  on, or.    ** a 
1b5e0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1b5f0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c  NIQUE clause fol
1b600 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d  lowing the colum
1b610 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20  n definitions.. 
1b620 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f     ** i.e. one o
1b630 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1b640 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1b650 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79  x PRIMARY KEY, y
1b660 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  );.    ** CREATE
1b670 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55   TABLE t(x, y, U
1b680 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20  NIQUE(x, y));.  
1b690 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68    **.    ** Eith
1b6a0 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f  er way, check to
1b6b0 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c   see if the tabl
1b6c0 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75  e already has su
1b6d0 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a  ch an index. If.
1b6e0 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74      ** so, don't
1b6f0 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67   bother creating
1b700 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20   this one. This 
1b710 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a  only applies to.
1b720 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
1b730 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ally created ind
1b740 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20  ices. Users can 
1b750 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20  do as they wish 
1b760 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c  with.    ** expl
1b770 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20  icit indices..  
1b780 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20    **.    ** Two 
1b790 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
1b7a0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
1b7b0 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1b7c0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
1b7d0 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70  ** (and thus sup
1b7e0 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63  pressing the sec
1b7f0 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66  ond one) even if
1b800 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65   they have diffe
1b810 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74  rent.    ** sort
1b820 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a   orders..    **.
1b830 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
1b840 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f  are different co
1b850 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1b860 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75  s or if the colu
1b870 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  mns of.    ** th
1b880 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63  e constraint occ
1b890 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  ur in different 
1b8a0 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65  orders, then the
1b8b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
1b8c0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1b8d0 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20  ed distinct and 
1b8e0 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73  both result in s
1b8f0 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e  eparate indices.
1b900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
1b910 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
1b920 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
1b930 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
1b940 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
1b950 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
1b960 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
1b970 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a 20  Index(pIdx) );. 
1b980 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
1b990 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1b9a0 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1b9b0 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  F );.      asser
1b9c0 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  t( IsUniqueIndex
1b9d0 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20 20  (pIndex) );..   
1b9e0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
1b9f0 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b  yCol!=pIndex->nK
1ba00 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
1ba10 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
1ba20 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   k<pIdx->nKeyCol
1ba30 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1ba40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
1ba50 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1ba60 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
1ba70 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69  assert( pIdx->ai
1ba80 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b 0a  Column[k]>=0 );.
1ba90 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1baa0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
1bab0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
1bac0 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
1bad0 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
1bae0 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1baf0 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
1bb00 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
1bb10 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1bb20 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
1bb30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1bb40 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
1bb50 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20  >nKeyCol ){.    
1bb60 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1bb70 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
1bb80 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
1bb90 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
1bba0 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
1bbb0 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
1bbc0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1bbd0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1bbe0 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
1bbf0 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
1bc00 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1bc10 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
1bc20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
1bc30 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
1bc40 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
1bc50 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
1bc60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1bc70 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
1bc80 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
1bc90 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
1bca0 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
1bcb0 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
1bcc0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
1bcd0 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
1bce0 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
1bcf0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1bd00 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
1bd10 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20 66  ified behavior f
1bd20 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  or the index..  
1bd30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1bd40 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d       if( !(pIdx-
1bd50 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1bd60 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e  ault || pIndex->
1bd70 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
1bd80 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
1bd90 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1bda0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1bdc0 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e  nflicting ON CON
1bdd0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70  FLICT clauses sp
1bde0 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20  ecified", 0);.  
1bdf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1be00 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
1be10 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1be20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
1be30 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d   pIdx->onError =
1be40 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
1be50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1be60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be70 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 51 4c  if( idxType==SQL
1be80 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d  ITE_IDXTYPE_PRIM
1be90 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d 3e 69  ARYKEY ) pIdx->i
1bea0 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70 65  dxType = idxType
1beb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1bec0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1bed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bee0 20 20 7d 0a 0a 20 20 69 66 28 20 21 49 4e 5f 52    }..  if( !IN_R
1bef0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
1bf00 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  .    /* Link the
1bf10 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63   new Index struc
1bf20 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c  ture to its tabl
1bf30 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68  e and to the oth
1bf40 65 72 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d 65 6d  er.    ** in-mem
1bf50 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
1bf60 75 63 74 75 72 65 73 2e 20 0a 20 20 20 20 2a 2f  uctures. .    */
1bf70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bf80 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
1bf90 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
1bfa0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 49  .busy ){.      I
1bfb0 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 61  ndex *p;.      a
1bfc0 73 73 65 72 74 28 20 21 49 4e 5f 53 50 45 43 49  ssert( !IN_SPECI
1bfd0 41 4c 5f 50 41 52 53 45 20 29 3b 0a 20 20 20 20  AL_PARSE );.    
1bfe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bff0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1c000 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
1c010 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
1c020 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
1c030 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
1c040 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
1c050 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 49  h, .          pI
1c060 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  ndex->zName, pIn
1c070 64 65 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  dex);.      if( 
1c080 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  p ){.        ass
1c090 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29  ert( p==pIndex )
1c0a0 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73  ;  /* Malloc mus
1c0b0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
1c0c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c0d0 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
1c0e0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1c0f0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1c100 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
1c110 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c  mDbFlags |= DBFL
1c120 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b  AG_SchemaChange;
1c130 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 6c 4e  .      if( pTblN
1c140 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
1c150 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
1c160 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1c170 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1c180 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c190 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1c1a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1c1b0 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1c1c0 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1c1d0 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61     ** index is a
1c1e0 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1c1f0 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1c200 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1c210 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20  traint) then.   
1c220 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f   ** emit code to
1c230 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   allocate the in
1c240 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20  dex rootpage on 
1c250 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e  disk and make an
1c260 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a   entry for.    *
1c270 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  * the index in t
1c280 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1c290 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c   table and popul
1c2a0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ate the index wi
1c2b0 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  th.    ** conten
1c2c0 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20  t.  But, do not 
1c2d0 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72  do this if we ar
1c2e0 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67  e simply reading
1c2f0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
1c300 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  er.    ** table 
1c310 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
1c320 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
1c330 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
1c340 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
1c350 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f     ** of a WITHO
1c360 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1c370 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1c380 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1c390 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1c3a0 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1c3b0 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1c3c0 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f  ARY KEY.    ** o
1c3d0 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1c3e0 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1c3f0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1c400 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  ce the table.   
1c410 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65   ** has just bee
1c420 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f  n created, it co
1c430 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61  ntains no data a
1c440 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69  nd the index ini
1c450 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
1c460 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
1c470 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
1c480 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52     else if( HasR
1c490 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54  owid(pTab) || pT
1c4a0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
1c4b0 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
1c4c0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1c4d0 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20       int iMem = 
1c4e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1c4f0 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74  .      v = sqlit
1c500 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1c510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d  );.      if( v==
1c520 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1c530 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20  eate_index;..   
1c540 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1c550 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1c560 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1c570 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
1c580 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
1c590 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67   the index using
1c5a0 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75   CreateIndex. Bu
1c5b0 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  t before.      *
1c5c0 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65  * doing so, code
1c5d0 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74   a Noop instruct
1c5e0 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ion and store it
1c5f0 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20  s address in .  
1c600 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75      ** Index.tnu
1c610 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  m. This is requi
1c620 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73  red in case this
1c630 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c   index is actual
1c640 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50  ly a .      ** P
1c650 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74  RIMARY KEY and t
1c660 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75  he table is actu
1c670 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52  ally a WITHOUT R
1c680 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a  OWID table. In .
1c690 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61        ** that ca
1c6a0 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1c6b0 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1c6c0 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1c6d0 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a   replace.      *
1c6e0 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20  * the Noop with 
1c6f0 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f  a Goto to jump o
1c700 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64  ver the VDBE cod
1c710 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f  e generated belo
1c720 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64  w. */.      pInd
1c730 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74  ex->tnum = sqlit
1c740 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1c750 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20  OP_Noop);.      
1c760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c770 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74  3(v, OP_CreateBt
1c780 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20  ree, iDb, iMem, 
1c790 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
1c7a0 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72  .      /* Gather
1c7b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
1c7c0 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
1c7d0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1c7e0 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
1c7f0 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
1c800 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
1c810 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
1c820 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28         int n = (
1c830 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61  int)(pParse->sLa
1c840 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d  stToken.z - pNam
1c850 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  e->z) + pParse->
1c860 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
1c870 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d        if( pName-
1c880 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e  >z[n-1]==';' ) n
1c890 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  --;.        /* A
1c8a0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1c8b0 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1c8c0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1c8d0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ment */.        
1c8e0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1c8f0 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1c900 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1c910 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e  ,.            on
1c920 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f  Error==OE_None ?
1c930 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c   "" : " UNIQUE",
1c940 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20   n, pName->z);. 
1c950 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c960 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
1c970 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
1c980 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
1c990 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
1c9a0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
1c9b0 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71     /* zStmt = sq
1c9c0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29  lite3MPrintf("")
1c9d0 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74  ; */.        zSt
1c9e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1c9f0 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  .      /* Add an
1ca00 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1ca10 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1ca20 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a   index.      */.
1ca30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
1ca40 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1ca50 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53   .          "INS
1ca60 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1ca70 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1ca80 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1ca90 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1caa0 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20  [iDb].zDbSName, 
1cab0 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20  MASTER_NAME,.   
1cac0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1cad0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
1cae0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
1caf0 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1cb00 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1cb10 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1cb20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1cb30 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20  , zStmt);..     
1cb40 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1cb50 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1cb60 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1cb70 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1cb80 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20  Expire.      ** 
1cb90 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  to invalidate al
1cba0 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  l pre-compiled s
1cbb0 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20  tatements..     
1cbc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54   */.      if( pT
1cbd0 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1cbe0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1cbf0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1cc00 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
1cc10 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1cc20 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1cc30 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
1cc40 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1cc50 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
1cc60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
1cc70 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1cc80 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20   "name='%q' AND 
1cc90 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70  type='index'", p
1cca0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
1ccb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ccc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ccd0 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b 0a 20  Expire, 0, 1);. 
1cce0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
1ccf0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1cd00 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  e(v, pIndex->tnu
1cd10 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  m);.    }.  }.. 
1cd20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1cd30 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1cd40 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1cd50 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1cd60 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1cd70 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1cd80 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1cd90 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1cda0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1cdb0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1cdc0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1cdd0 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1cde0 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1cdf0 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1ce00 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1ce10 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1ce20 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1ce30 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1ce40 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1ce50 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1ce60 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1ce70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1ce80 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1ce90 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1cea0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1ceb0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1cec0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1ced0 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1cee0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1cef0 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1cf00 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1cf10 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1cf20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1cf30 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1cf40 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1cf50 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1cf60 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1cf70 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1cf80 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1cf90 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1cfa0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1cfb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1cfc0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1cfd0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1cfe0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1cff0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1d000 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  }.    pIndex = 0
1d010 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
1d020 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
1d030 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
1d040 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
1d050 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ex==0 );.    pPa
1d060 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d  rse->pNewIndex =
1d070 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e   pIndex;.    pIn
1d080 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
1d090 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
1d0a0 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
1d0b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
1d0c0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20  .  if( pIndex ) 
1d0d0 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78  sqlite3FreeIndex
1d0e0 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20  (db, pIndex);.  
1d0f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1d100 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b  e(db, pPIWhere);
1d110 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
1d120 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1d130 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  st);.  sqlite3Sr
1d140 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
1d150 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  pTblName);.  sql
1d160 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1d170 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1d180 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
1d190 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
1d1a0 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
1d1b0 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
1d1c0 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
1d1d0 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
1d1e0 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
1d1f0 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
1d200 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
1d210 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
1d220 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1d230 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1d240 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
1d250 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
1d260 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
1d270 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
1d280 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
1d290 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
1d2a0 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1d2b0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
1d2c0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1d2d0 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
1d2e0 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
1d2f0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
1d300 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
1d310 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1d320 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
1d330 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
1d340 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1d350 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
1d360 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1d370 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1d380 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1d390 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1d3a0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1d3b0 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1d3c0 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1d3d0 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1d3e0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1d3f0 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1d400 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1d410 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1d420 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1d430 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1d440 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1d450 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1d460 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1d470 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1d480 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1d490 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1d4a0 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1d4b0 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1d4c0 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1d4d0 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1d4e0 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20  Idx){.  /*      
1d4f0 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39            10,  9
1d500 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a  ,  8,  7,  6 */.
1d510 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20    LogEst aVal[] 
1d520 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20  = { 33, 32, 30, 
1d530 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45  28, 26 };.  LogE
1d540 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  st *a = pIdx->ai
1d550 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74  RowLogEst;.  int
1d560 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72   nCopy = MIN(Arr
1d570 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49  aySize(aVal), pI
1d580 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
1d590 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64  int i;..  /* Ind
1d5a0 65 78 65 73 20 77 69 74 68 20 64 65 66 61 75 6c  exes with defaul
1d5b0 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20  t row estimates 
1d5c0 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
1d5d0 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20  stat1 data */.  
1d5e0 61 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68  assert( !pIdx->h
1d5f0 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a  asStat1 );..  /*
1d600 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1d610 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1d620 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1d630 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1d640 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1d650 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1d660 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74  table, or half t
1d670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1d680 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  s in the table. 
1d690 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61   ** for a partia
1d6a0 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64  l index.   But d
1d6b0 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73  o not let the es
1d6c0 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f  timate drop belo
1d6d0 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20  w 10. */.  a[0] 
1d6e0 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1d6f0 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66  nRowLogEst;.  if
1d700 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  ( pIdx->pPartIdx
1d710 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20  Where!=0 ) a[0] 
1d720 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20  -= 10;  assert( 
1d730 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  10==sqlite3LogEs
1d740 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b  t(2) );.  if( a[
1d750 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33  0]<33 ) a[0] = 3
1d760 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
1d770 20 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d      assert( 33==
1d780 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
1d790 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  ) );..  /* Estim
1d7a0 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73  ate that a[1] is
1d7b0 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20   10, a[2] is 9, 
1d7c0 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20  a[3] is 8, a[4] 
1d7d0 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20  is 7, a[5] is.  
1d7e0 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75  ** 6 and each su
1d7f0 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28  bsequent value (
1d800 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a  if any) is 5.  *
1d810 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d  /.  memcpy(&a[1]
1d820 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69  , aVal, nCopy*si
1d830 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20  zeof(LogEst));. 
1d840 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20   for(i=nCopy+1; 
1d850 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  i<=pIdx->nKeyCol
1d860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d  ; i++){.    a[i]
1d870 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20   = 23;          
1d880 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d890 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 23==sqlite3Log
1d8a0 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20  Est(5) );.  }.. 
1d8b0 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
1d8c0 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a  te3LogEst(1) );.
1d8d0 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
1d8e0 64 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49  dex(pIdx) ) a[pI
1d8f0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30  dx->nKeyCol] = 0
1d900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d910 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
1d920 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
1d930 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
1d940 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
1d950 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
1d960 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
1d970 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d980 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
1d990 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1d9a0 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
1d9b0 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
1d9c0 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
1d9d0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
1d9e0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1d9f0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
1da00 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1da10 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65  rr==0 );   /* Ne
1da20 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
1da30 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
1da40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1da50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1da60 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1da70 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1da80 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
1da90 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
1daa0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1dab0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1dac0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1dad0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1dae0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1daf0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1db00 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
1db10 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
1db20 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
1db30 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
1db40 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
1db50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1db60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1db70 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
1db80 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
1db90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dba0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1dbb0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
1dbc0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
1dbd0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1dbe0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
1dbf0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
1dc00 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1dc10 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1dc20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64    if( pIndex->id
1dc30 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44  xType!=SQLITE_ID
1dc40 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a  XTYPE_APPDEF ){.
1dc50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1dc60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64  Msg(pParse, "ind
1dc70 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1dc80 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20  th UNIQUE ".    
1dc90 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45    "or PRIMARY KE
1dca0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e  Y constraint can
1dcb0 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
1dcc0 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78   0);.    goto ex
1dcd0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
1dce0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1dcf0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1dd00 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
1dd10 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ema);.#ifndef SQ
1dd20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
1dd30 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
1dd40 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  int code = SQLIT
1dd50 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20  E_DROP_INDEX;.  
1dd60 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1dd70 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a  pIndex->pTable;.
1dd80 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1dd90 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
1dda0 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
1ddb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1ddc0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
1ddd0 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73  (iDb);.    if( s
1dde0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1ddf0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
1de00 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
1de10 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1de20 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1de30 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
1de40 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
1de50 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53  & iDb ) code = S
1de60 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
1de70 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1de80 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1de90 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49  pParse, code, pI
1dea0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61  ndex->zName, pTa
1deb0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
1dec0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1ded0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1dee0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1def0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1df00 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
1df10 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20   index and from 
1df20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
1df30 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1df40 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1df50 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1df60 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
1df70 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
1df80 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20  se, 1, iDb);.   
1df90 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
1dfa0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
1dfb0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1dfc0 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65  %Q.%s WHERE name
1dfd0 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  =%Q AND type='in
1dfe0 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62  dex'",.       db
1dff0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
1e000 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  ame, MASTER_NAME
1e010 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a  , pIndex->zName.
1e020 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1e030 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
1e040 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
1e050 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  idx", pIndex->zN
1e060 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
1e070 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1e080 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1e090 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
1e0a0 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
1e0b0 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
1e0c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e0d0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
1e0e0 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
1e0f0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
1e100 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
1e110 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
1e120 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1e130 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
1e140 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
1e150 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
1e160 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45  ay of objects. E
1e170 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  ach object in th
1e180 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a  e.** array is sz
1e190 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73  Entry bytes in s
1e1a0 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ize. This routin
1e1b0 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62  e uses sqlite3Db
1e1c0 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20  Realloc().** to 
1e1d0 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79  extend the array
1e1e0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
1e1f0 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  s space for a ne
1e200 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  w object at the 
1e210 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  end..**.** When 
1e220 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e230 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72   called, *pnEntr
1e240 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  y contains the c
1e250 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a  urrent size of.*
1e260 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20  * the array (in 
1e270 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65  entries - so the
1e280 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28   allocation is (
1e290 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45  (*pnEntry) * szE
1e2a0 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69  ntry) bytes.** i
1e2b0 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  n total)..**.** 
1e2c0 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  If the realloc()
1e2d0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28   is successful (
1e2e0 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63  i.e. if no OOM c
1e2f0 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29  ondition occurs)
1e300 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  , the.** space a
1e310 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1e320 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a   new object is z
1e330 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20  eroed, *pnEntry 
1e340 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65  updated to.** re
1e350 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69  flect the new si
1e360 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
1e370 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
1e380 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
1e390 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ion.** returned.
1e3a0 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1e3b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1e3c0 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72  e new array entr
1e3d0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
1e3e0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1e3f0 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   if the realloc(
1e400 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69  ) fails, *pIdx i
1e410 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e  s set to -1, *pn
1e420 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a  Entry remains.**
1e430 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
1e440 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20   copy of pArray 
1e450 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  returned..*/.voi
1e460 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
1e470 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
1e480 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
1e490 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1e4a0 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1e4b0 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
1e4c0 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
1e4d0 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
1e4e0 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
1e4f0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
1e500 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
1e510 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
1e520 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
1e530 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  rray */.  int *p
1e540 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
1e550 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
1e560 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1e570 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  e */.  int *pIdx
1e580 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1e590 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
1e5a0 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
1e5b0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
1e5c0 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74    int n = *pnEnt
1e5d0 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28  ry;.  if( (n & (
1e5e0 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n-1))==0 ){.    
1e5f0 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20  int sz = (n==0) 
1e600 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76  ? 1 : 2*n;.    v
1e610 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  oid *pNew = sqli
1e620 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1e630 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e   pArray, sz*szEn
1e640 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
1e650 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
1e660 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
1e670 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1e680 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79      }.    pArray
1e690 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
1e6a0 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
1e6b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20  ;.  memset(&z[n 
1e6c0 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73  * szEntry], 0, s
1e6d0 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78  zEntry);.  *pIdx
1e6e0 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74   = n;.  ++*pnEnt
1e6f0 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
1e700 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
1e710 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
1e720 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
1e730 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
1e740 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
1e750 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
1e760 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
1e770 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
1e780 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
1e790 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
1e7a0 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
1e7b0 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61  ppend(Parse *pPa
1e7c0 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  rse, IdList *pLi
1e7d0 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
1e7e0 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  n){.  sqlite3 *d
1e7f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1e800 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1e810 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1e820 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1e830 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1e840 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
1e850 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1e860 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1e870 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73  }.  pList->a = s
1e880 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1e890 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20  ate(.      db,. 
1e8a0 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20       pList->a,. 
1e8b0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73       sizeof(pLis
1e8c0 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20  t->a[0]),.      
1e8d0 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
1e8e0 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
1e8f0 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
1e900 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1e910 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
1e920 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e930 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e940 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1e950 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
1e960 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52  ken);.  if( IN_R
1e970 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20  ENAME_OBJECT && 
1e980 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e990 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e9a0 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
1e9b0 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c  Parse, (void*)pL
1e9c0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
1e9d0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20   pToken);.  }.  
1e9e0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1e9f0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1ea00 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1ea10 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1ea20 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1ea30 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1ea40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1ea50 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1ea60 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1ea70 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1ea80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1ea90 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1eaa0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1eab0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1eac0 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1ead0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
1eae0 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  N(db, pList);.}.
1eaf0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1eb00 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1eb10 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1eb20 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1eb30 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1eb40 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1eb50 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1eb60 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1eb70 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1eb80 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1eb90 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1eba0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1ebb0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1ebc0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1ebd0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1ebe0 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1ebf0 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1ec00 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1ec10 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1ec20 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1ec30 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1ec40 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1ec50 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1ec60 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1ec70 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1ec80 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1ec90 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1eca0 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1ecb0 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1ecc0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ecd0 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1ece0 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1ecf0 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1ed00 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1ed10 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1ed20 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1ed30 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1ed40 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1ed50 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1ed60 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1ed70 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1ed80 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1ed90 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1eda0 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1edb0 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1edc0 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1edd0 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1ede0 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1edf0 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1ee00 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1ee10 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1ee20 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1ee30 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1ee40 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1ee50 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1ee60 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1ee70 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1ee80 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1ee90 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1eea0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1eeb0 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1eec0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1eed0 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1eee0 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1eef0 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1ef00 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1ef10 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1ef20 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1ef30 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1ef40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1ef50 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1ef60 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1ef70 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1ef80 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1ef90 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1efa0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1efb0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1efc0 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1efd0 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1efe0 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1eff0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1f000 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1f010 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1f020 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1f030 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1f040 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1f050 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1f060 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1f070 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1f080 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1f090 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1f0a0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1f0b0 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1f0c0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1f0d0 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1f0e0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1f0f0 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1f100 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1f110 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1f120 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1f130 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1f140 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74  Src->nSrc*2+nExt
1f150 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
1f160 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1f170 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1f180 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20  , pSrc,.        
1f190 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
1f1a0 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31  Src) + (nAlloc-1
1f1b0 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )*sizeof(pSrc->a
1f1c0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
1f1d0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1f1e0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1f1f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1f200 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
1f210 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d      }.    pSrc =
1f220 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20   pNew;.    nGot 
1f230 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  = (sqlite3DbMall
1f240 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29  ocSize(db, pNew)
1f250 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29   - sizeof(*pSrc)
1f260 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  )/sizeof(pSrc->a
1f270 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63  [0])+1;.    pSrc
1f280 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b  ->nAlloc = nGot;
1f290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
1f2a0 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
1f2b0 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
1f2c0 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
1f2d0 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
1f2e0 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
1f2f0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1f300 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
1f310 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
1f320 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
1f330 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
1f340 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45  pSrc->nSrc += nE
1f350 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  xtra;..  /* Zero
1f360 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63   the newly alloc
1f370 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  ated slots */.  
1f380 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b  memset(&pSrc->a[
1f390 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  iStart], 0, size
1f3a0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e  of(pSrc->a[0])*n
1f3b0 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d  Extra);.  for(i=
1f3c0 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74  iStart; i<iStart
1f3d0 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20  +nExtra; i++){. 
1f3e0 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43     pSrc->a[i].iC
1f3f0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a  ursor = -1;.  }.
1f400 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  .  /* Return a p
1f410 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e  ointer to the en
1f420 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a  larged SrcList *
1f430 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b  /.  return pSrc;
1f440 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .}.../*.** Appen
1f450 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  d a new table na
1f460 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  me to the given 
1f470 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65  SrcList.  Create
1f480 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69   a new SrcList i
1f490 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41  f.** need be.  A
1f4a0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72   new entry is cr
1f4b0 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63  eated in the Src
1f4c0 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61  List even if pTa
1f4d0 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  ble is NULL..**.
1f4e0 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20  ** A SrcList is 
1f4f0 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
1f500 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  L if there is an
1f510 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65   OOM error.  The
1f520 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63   returned.** Src
1f530 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68  List might be th
1f540 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72  e same as the Sr
1f550 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69  cList that was i
1f560 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74  nput or it might
1f570 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65   be.** a new one
1f580 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  .  If an OOM err
1f590 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20  or does occurs, 
1f5a0 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76  then the prior v
1f5b0 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a  alue of pList.**
1f5c0 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74   that is input t
1f5d0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1f5e0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
1f5f0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  freed..**.** If 
1f600 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74  pDatabase is not
1f610 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20   null, it means 
1f620 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68  that the table h
1f630 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a  as an optional.*
1f640 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * database name 
1f650 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68  prefix.  Like th
1f660 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74  is:  "database.t
1f670 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74  able".  The pDat
1f680 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20  abase.** points 
1f690 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  to the table nam
1f6a0 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65  e and the pTable
1f6b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64   points to the d
1f6c0 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a  atabase name..**
1f6d0 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d   The SrcList.a[]
1f6e0 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20  .zName field is 
1f6f0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
1f700 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68  table name which
1f710 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66   might.** come f
1f720 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70  rom pTable (if p
1f730 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1f740 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62  ) or from pDatab
1f750 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73  ase.  .** SrcLis
1f760 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20  t.a[].zDatabase 
1f770 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
1f780 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1f790 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a   from pTable,.**
1f7a0 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66   or with NULL if
1f7b0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
1f7c0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
1f7d0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1f7e0 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68   if call like th
1f7f0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1f800 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1f810 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b  Append(D,A,B,0);
1f820 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73  .**.** Then B is
1f830 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   a table name an
1f840 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  d the database n
1f850 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69  ame is unspecifi
1f860 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a  ed.  If called.*
1f870 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  * like this:.**.
1f880 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  **         sqlit
1f890 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1f8a0 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20  D,A,B,C);.**.** 
1f8b0 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61  Then C is the ta
1f8c0 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69  ble name and B i
1f8d0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  s the database n
1f8e0 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65  ame.  If C is de
1f8f0 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f  fined.** then so
1f900 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72   is B.  In other
1f910 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72   words, we never
1f920 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65   have a case whe
1f930 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
1f940 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1f950 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b  Append(D,A,0,C);
1f960 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62  .**.** Both pTab
1f970 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1f980 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20   are assumed to 
1f990 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79  be quoted.  They
1f9a0 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a   are dequoted.**
1f9b0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64   before being ad
1f9c0 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69  ded to the SrcLi
1f9d0 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  st..*/.SrcList *
1f9e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1f9f0 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20  pend(.  sqlite3 
1fa00 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  *db,        /* C
1fa10 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1fa20 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1fa30 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c  ilures */.  SrcL
1fa40 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1fa50 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1fa60 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20  s SrcList. NULL 
1fa70 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72  creates a new Sr
1fa80 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  cList */.  Token
1fa90 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f   *pTable,      /
1faa0 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e  * Table to appen
1fab0 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  d */.  Token *pD
1fac0 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61  atabase    /* Da
1fad0 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61  tabase of the ta
1fae0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ble */.){.  stru
1faf0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1fb00 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74  *pItem;.  assert
1fb10 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c  ( pDatabase==0 |
1fb20 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20  | pTable!=0 );  
1fb30 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43  /* Cannot have C
1fb40 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20   without B */.  
1fb50 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1fb60 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1fb70 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1fb80 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1fb90 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  wNN(db, sizeof(S
1fba0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
1fbb0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1fbc0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
1fbd0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
1fbe0 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 20 3d     pList->nSrc =
1fbf0 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
1fc00 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 2c 20  pList->a[0], 0, 
1fc10 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1fc20 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  0]));.    pList-
1fc30 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[0].iCursor = 
1fc40 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
1fc50 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1fc60 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1fc70 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
1fc80 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d 0a 20  st->nSrc);.  }. 
1fc90 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1fca0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
1fcb0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1fcc0 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1fcd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1fce0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
1fcf0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
1fd00 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
1fd10 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
1fd20 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
1fd30 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1fd40 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1fd50 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
1fd60 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1fd70 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1fd80 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  pDatabase);.    
1fd90 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1fda0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1fdb0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
1fdc0 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  le);.  }else{.  
1fdd0 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
1fde0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1fdf0 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65  Token(db, pTable
1fe00 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44  );.    pItem->zD
1fe10 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1fe20 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1fe30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1fe40 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1fe50 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1fe60 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1fe70 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1fe80 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1fe90 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1fea0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1feb0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1fec0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1fed0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1fee0 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1fef0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1ff00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1ff10 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1ff20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1ff30 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1ff40 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1ff50 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1ff60 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1ff70 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1ff80 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1ff90 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1ffa0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1ffb0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1ffc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1ffd0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1ffe0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1fff0 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
20000 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20010 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
20020 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
20030 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
20040 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
20050 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
20060 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
20070 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
20080 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
20090 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
200a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
200b0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
200c0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
200d0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
200e0 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
200f0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
20100 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
20110 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20120 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
20130 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
20140 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
20150 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
20160 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20170 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
20180 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
20190 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73  .isIndexedBy ) s
201a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
201b0 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
201c0 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20  xedBy);.    if( 
201d0 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
201e0 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70  unc ) sqlite3Exp
201f0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
20200 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
20210 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
20220 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
20230 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
20240 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
20250 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
20260 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
20270 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
20280 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
20290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
202a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
202b0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
202c0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
202d0 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
202e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
202f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20300 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
20310 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
20320 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
20330 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
20340 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
20350 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
20360 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
20370 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
20380 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
20390 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
203a0 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
203b0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
203c0 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
203d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
203e0 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
203f0 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
20400 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
20410 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
20420 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
20430 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
20440 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
20450 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
20460 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
20470 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
20480 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
20490 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
204a0 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
204b0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
204c0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
204d0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
204e0 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
204f0 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
20500 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
20510 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
20520 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
20530 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
20540 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
20550 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
20560 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
20570 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
20580 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
20590 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
205a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
205b0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
205c0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
205d0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
205e0 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
205f0 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
20600 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
20610 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
20620 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
20630 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
20640 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20650 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
20660 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20670 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
20680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20690 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
206a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
206b0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
206c0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
206d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
206e0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
206f0 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
20700 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
20710 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
20720 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
20730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
20740 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
20750 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
20760 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
20770 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
20780 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
20790 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
207a0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
207b0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
207c0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
207d0 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
207e0 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
207f0 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
20800 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
20810 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
20820 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
20830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20840 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
20850 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
20860 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
20870 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
20880 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
20890 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
208a0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
208b0 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
208c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
208d0 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
208e0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
208f0 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
20900 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
20910 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
20920 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
20930 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
20940 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
20950 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
20960 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
20970 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
20980 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
20990 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
209a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
209b0 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 74 65  nSrc>0 );.  pIte
209c0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
209d0 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
209e0 28 70 54 61 62 6c 65 3d 3d 30 29 3d 3d 28 70 44  (pTable==0)==(pD
209f0 61 74 61 62 61 73 65 3d 3d 30 29 20 29 3b 0a 20  atabase==0) );. 
20a00 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
20a10 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 61 74  zName==0 || pDat
20a20 61 62 61 73 65 21 3d 30 20 29 3b 0a 20 20 69 66  abase!=0 );.  if
20a30 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
20a40 43 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61  CT && pItem->zNa
20a50 6d 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  me ){.    Token 
20a60 2a 70 54 6f 6b 65 6e 20 3d 20 28 41 4c 57 41 59  *pToken = (ALWAY
20a70 53 28 70 44 61 74 61 62 61 73 65 29 20 26 26 20  S(pDatabase) && 
20a80 70 44 61 74 61 62 61 73 65 2d 3e 7a 29 20 3f 20  pDatabase->z) ? 
20a90 70 44 61 74 61 62 61 73 65 20 3a 20 70 54 61 62  pDatabase : pTab
20aa0 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  le;.    sqlite3R
20ab0 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
20ac0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  arse, pItem->zNa
20ad0 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d  me, pToken);.  }
20ae0 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
20af0 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
20b00 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
20b10 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
20b20 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
20b30 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
20b40 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
20b50 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
20b60 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
20b70 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
20b80 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
20b90 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
20ba0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
20bb0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
20bc0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
20bd0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
20be0 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
20bf0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
20c00 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
20c10 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
20c20 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
20c30 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
20c40 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
20c50 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
20c60 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
20c70 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
20c80 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
20c90 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
20ca0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
20cb0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
20cc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20cd0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
20ce0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20cf0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
20d00 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
20d10 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
20d20 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
20d30 20 70 20 26 26 20 70 49 6e 64 65 78 65 64 42 79   p && pIndexedBy
20d40 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  ->n>0 ){.    str
20d50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
20d60 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
20d70 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29  ert( p->nSrc>0 )
20d80 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
20d90 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
20da0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
20db0 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
20dc0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
20dd0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
20de0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
20df0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
20e00 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
20e10 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
20e20 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
20e30 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
20e40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
20e50 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
20e60 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
20e70 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
20e80 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
20e90 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
20ea0 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
20eb0 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e       pItem->fg.n
20ec0 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20  otIndexed = 1;. 
20ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20ee0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
20ef0 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61  edBy = sqlite3Na
20f00 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
20f10 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64  se->db, pIndexed
20f20 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  By);.      pItem
20f30 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
20f40 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
20f50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
20f60 20 6c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   list of functio
20f70 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  n arguments to t
20f80 68 65 20 53 72 63 4c 69 73 74 20 65 6e 74 72 79  he SrcList entry
20f90 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 2d   for a.** table-
20fa0 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 2e  valued-function.
20fb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20fc0 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
20fd0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
20fe0 72 63 4c 69 73 74 20 2a 70 2c 20 45 78 70 72 4c  rcList *p, ExprL
20ff0 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
21000 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  f( p ){.    stru
21010 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21020 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
21030 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61  ->nSrc-1];.    a
21040 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
21050 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29  .notIndexed==0 )
21060 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
21070 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
21080 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  dBy==0 );.    as
21090 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
210a0 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
210b0 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46      pItem->u1.pF
210c0 75 6e 63 41 72 67 20 3d 20 70 4c 69 73 74 3b 0a  uncArg = pList;.
210d0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
210e0 54 61 62 46 75 6e 63 20 3d 20 31 3b 0a 20 20 7d  TabFunc = 1;.  }
210f0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
21100 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
21110 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73  pParse->db, pLis
21120 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
21130 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75   When building u
21140 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  p a FROM clause 
21150 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  in the parser, t
21160 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
21170 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  .** is initially
21180 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
21190 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20   left operand.  
211a0 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e  But the code gen
211b0 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74  erator.** expect
211c0 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  s the join opera
211d0 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65  tor to be on the
211e0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
211f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
21200 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e   Shifts all join
21210 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20   operators from 
21220 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f  left to right fo
21230 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d  r an entire FROM
21240 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  .** clause..**.*
21250 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f  * Example: Suppo
21260 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c  se the join is l
21270 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
21280 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75            A natu
21290 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42  ral cross join B
212a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61  .**.** The opera
212b0 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20  tor is "natural 
212c0 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68  cross join".  Th
212d0 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e  e A and B operan
212e0 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a  ds are stored.**
212f0 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20   in p->a[0] and 
21300 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74  p->a[1], respect
21310 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73  ively.  The pars
21320 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f  er initially sto
21330 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  res the.** opera
21340 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69  tor with A.  Thi
21350 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73  s routine shifts
21360 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f   that operator o
21370 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69  ver to B..*/.voi
21380 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
21390 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72  ShiftJoinType(Sr
213a0 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28  cList *p){.  if(
213b0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
213c0 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
213d0 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
213e0 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 66  .      p->a[i].f
213f0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  g.jointype = p->
21400 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  a[i-1].fg.jointy
21410 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
21420 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[0].fg.jointyp
21430 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
21440 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
21450 45 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 47  E code for a BEG
21460 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  IN statement..*/
21470 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
21480 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
21490 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
214a0 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
214b0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
214c0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
214d0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
214e0 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
214f0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
21500 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  db!=0 );.  if( s
21510 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
21520 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
21530 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47  RANSACTION, "BEG
21540 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IN", 0, 0) ){.  
21550 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
21560 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
21570 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
21580 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !v ) return;. 
21590 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45   if( type!=TK_DE
215a0 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f  FERRED ){.    fo
215b0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
215c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
215d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
215e0 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  v, OP_Transactio
215f0 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f  n, i, (type==TK_
21600 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20  EXCLUSIVE)+1);. 
21610 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21620 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b  UsesBtree(v, i);
21630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
21640 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
21650 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 29  , OP_AutoCommit)
21660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
21670 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f  ate VDBE code fo
21680 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f  r a COMMIT or RO
21690 4c 4c 42 41 43 4b 20 73 74 61 74 65 6d 65 6e 74  LLBACK statement
216a0 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 52 4f  ..** Code for RO
216b0 4c 4c 42 41 43 4b 20 69 73 20 67 65 6e 65 72 61  LLBACK is genera
216c0 74 65 64 20 69 66 20 65 54 79 70 65 3d 3d 54 4b  ted if eType==TK
216d0 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 4f 74 68 65  _ROLLBACK.  Othe
216e0 72 77 69 73 65 0a 2a 2a 20 63 6f 64 65 20 69 73  rwise.** code is
216f0 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 61   generated for a
21700 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a 76 6f 69 64   COMMIT..*/.void
21710 20 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73   sqlite3EndTrans
21720 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
21730 61 72 73 65 2c 20 69 6e 74 20 65 54 79 70 65 29  arse, int eType)
21740 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  {.  Vdbe *v;.  i
21750 6e 74 20 69 73 52 6f 6c 6c 62 61 63 6b 3b 0a 0a  nt isRollback;..
21760 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
21770 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21780 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
21790 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ;.  assert( eTyp
217a0 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 20 7c 7c 20  e==TK_COMMIT || 
217b0 65 54 79 70 65 3d 3d 54 4b 5f 45 4e 44 20 7c 7c  eType==TK_END ||
217c0 20 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42   eType==TK_ROLLB
217d0 41 43 4b 20 29 3b 0a 20 20 69 73 52 6f 6c 6c 62  ACK );.  isRollb
217e0 61 63 6b 20 3d 20 65 54 79 70 65 3d 3d 54 4b 5f  ack = eType==TK_
217f0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 69 66 28 20  ROLLBACK;.  if( 
21800 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21810 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
21820 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 0a 20 20  TRANSACTION, .  
21830 20 20 20 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20       isRollback 
21840 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22  ? "ROLLBACK" : "
21850 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
21860 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
21870 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
21880 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
21890 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
218a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
218b0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
218c0 74 2c 20 31 2c 20 69 73 52 6f 6c 6c 62 61 63 6b  t, 1, isRollback
218d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
218e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
218f0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
21900 61 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61  arser when it pa
21910 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74  rses a command t
21920 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c  o create,.** rel
21930 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
21940 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e   an SQL savepoin
21950 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  t. .*/.void sqli
21960 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72  te3Savepoint(Par
21970 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
21980 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  op, Token *pName
21990 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
219a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
219b0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
219c0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
219d0 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56  ( zName ){.    V
219e0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
219f0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
21a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21a10 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
21a20 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ON.    static co
21a30 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  nst char * const
21a40 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e   az[] = { "BEGIN
21a50 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
21a60 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20  OLLBACK" };.    
21a70 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49  assert( !SAVEPOI
21a80 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45  NT_BEGIN && SAVE
21a90 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31  POINT_RELEASE==1
21aa0 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   && SAVEPOINT_RO
21ab0 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e  LLBACK==2 );.#en
21ac0 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c  dif.    if( !v |
21ad0 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  | sqlite3AuthChe
21ae0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
21af0 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b  E_SAVEPOINT, az[
21b00 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29  op], zName, 0) )
21b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
21b20 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
21b30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
21b40 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
21b50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21b60 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f  Op4(v, OP_Savepo
21b70 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a  int, op, 0, 0, z
21b80 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Name, P4_DYNAMIC
21b90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21ba0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
21bb0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
21bc0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
21bd0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
21be0 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
21bf0 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
21c00 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
21c10 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
21c20 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
21c30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
21c40 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
21c50 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
21c60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21c70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
21c80 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
21c90 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
21ca0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
21cb0 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a   rc;.    Btree *
21cc0 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20  pBt;.    static 
21cd0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
21ce0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
21cf0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
21d00 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
21d10 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
21d20 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
21d30 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
21d40 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
21d50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
21d60 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
21d70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
21d80 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
21d90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21da0 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
21db0 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20  0, db, &pBt, 0, 
21dc0 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
21dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
21df0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
21e00 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
21e10 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
21e20 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
21e30 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
21e40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
21e50 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
21e60 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
21e70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
21e80 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  .    db->aDb[1].
21e90 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61  pBt = pBt;.    a
21ea0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31  ssert( db->aDb[1
21eb0 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ].pSchema );.   
21ec0 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   if( SQLITE_NOME
21ed0 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  M==sqlite3BtreeS
21ee0 65 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20  etPageSize(pBt, 
21ef0 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
21f00 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20  , -1, 0) ){.    
21f10 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
21f20 74 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74  t(db);.      ret
21f30 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
21f40 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21f50 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
21f60 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
21f70 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
21f80 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
21f90 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
21fa0 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
21fb0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
21fc0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
21fd0 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
21fe0 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
21ff0 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
22000 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
22010 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
22020 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
22030 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
22040 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
22050 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
22060 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
22070 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
22080 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
22090 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
220a0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
220b0 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
220c0 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
220d0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73  db->nDb );.  ass
220e0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
220f0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
22100 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
22110 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
22120 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
22130 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  2 );.  assert( s
22140 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
22150 78 48 65 6c 64 28 70 50 61 72 73 65 2d 3e 64 62  xHeld(pParse->db
22160 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69  , iDb, 0) );.  i
22170 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54  f( DbMaskTest(pT
22180 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
22190 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a  ask, iDb)==0 ){.
221a0 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54      DbMaskSet(pT
221b0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
221c0 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 69  ask, iDb);.    i
221d0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
221e0 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
221f0 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65     sqlite3OpenTe
22200 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c  mpDatabase(pTopl
22210 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  evel);.    }.  }
22220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67  .}../*.** If arg
22230 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c  ument zDb is NUL
22240 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c  L, then call sql
22250 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
22260 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20  hema() for each 
22270 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
22280 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65  abase. Otherwise
22290 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20  , invoke it for 
222a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
222b0 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ed zDb only..*/.
222c0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
222d0 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
222e0 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
222f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22300 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
22310 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
22320 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22330 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
22340 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
22350 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
22360 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
22370 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73  && (!zDb || 0==s
22380 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
22390 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65  b, pDb->zDbSName
223a0 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
223b0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
223c0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
223d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
223e0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
223f0 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
22400 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
22410 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
22420 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
22430 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
22440 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22450 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
22460 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
22470 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
22480 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
22490 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
224a0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
224b0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
224c0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
224d0 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
224e0 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
224f0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
22500 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
22510 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
22520 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
22530 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
22540 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
22550 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
22560 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
22570 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
22580 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
22590 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
225a0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
225b0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
225c0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
225d0 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
225e0 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
225f0 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
22600 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
22610 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
22620 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
22630 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
22640 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
22650 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
22660 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
22670 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
22680 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
22690 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
226a0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
226b0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
226c0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
226d0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
226e0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
226f0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
22700 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
22710 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
22720 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
22730 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
22740 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
22750 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
22760 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
22770 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
22780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
22790 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
227a0 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
227b0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
227c0 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
227d0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
227e0 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
227f0 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
22800 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
22810 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
22820 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
22830 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
22840 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
22850 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
22860 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
22870 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
22880 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
22890 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
228a0 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
228b0 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
228c0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
228d0 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
228e0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
228f0 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
22900 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
22910 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
22920 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
22930 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
22940 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
22950 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
22960 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
22970 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
22980 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
22990 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
229a0 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
229b0 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
229c0 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
229d0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
229e0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
229f0 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
22a00 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
22a10 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
22a20 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
22a30 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
22a40 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
22a50 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
22a60 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
22a70 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
22a80 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
22a90 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
22aa0 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
22ab0 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
22ac0 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
22ad0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
22ae0 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
22af0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
22b00 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
22b10 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
22b20 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
22b30 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
22b40 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
22b50 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
22b60 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
22b70 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
22b80 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
22b90 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
22ba0 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
22bb0 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
22bc0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
22bd0 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
22be0 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
22bf0 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
22c00 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
22c10 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
22c20 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
22c30 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
22c40 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
22c50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
22c60 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
22c70 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
22c80 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
22c90 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
22ca0 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
22cb0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
22cc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22cd0 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
22ce0 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
22cf0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
22d00 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
22d10 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
22d20 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
22d30 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
22d40 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
22d50 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
22d60 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
22d70 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
22d80 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
22d90 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
22da0 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
22db0 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
22dc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
22dd0 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
22de0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
22df0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
22e00 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
22e10 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
22e20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
22e30 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
22e40 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
22e50 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
22e60 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
22e70 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
22e80 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
22e90 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
22ea0 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
22eb0 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
22ec0 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
22ed0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
22ee0 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
22ef0 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
22f00 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
22f10 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
22f20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
22f30 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
22f40 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
22f50 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
22f60 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
22f70 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
22f80 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
22f90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
22fa0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
22fb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
22fc0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
22fd0 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
22fe0 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
22ff0 74 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  type);.  sqlite3
23000 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
23010 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a  p5Errmsg);.}../*
23020 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
23030 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55  alt due to UNIQU
23040 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
23050 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
23060 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
23070 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
23080 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
23090 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
230a0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
230b0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
230c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61        /* Constra
230d0 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e  int type */.  In
230e0 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
230f0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
23100 74 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63  t triggers the c
23110 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a  onstraint */.){.
23120 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
23130 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75  int j;.  StrAccu
23140 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c  m errMsg;.  Tabl
23150 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e  e *pTab = pIdx->
23160 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74  pTable;..  sqlit
23170 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
23180 65 72 72 4d 73 67 2c 20 70 50 61 72 73 65 2d 3e  errMsg, pParse->
23190 64 62 2c 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a  db, 0, 0, 200);.
231a0 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c    if( pIdx->aCol
231b0 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  Expr ){.    sqli
231c0 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 28  te3_str_appendf(
231d0 26 65 72 72 4d 73 67 2c 20 22 69 6e 64 65 78 20  &errMsg, "index 
231e0 27 25 71 27 22 2c 20 70 49 64 78 2d 3e 7a 4e 61  '%q'", pIdx->zNa
231f0 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
23200 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
23210 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
23220 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
23230 6f 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ol;.      assert
23240 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
23250 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  [j]>=0 );.      
23260 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
23270 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
23280 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
23290 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65    if( j ) sqlite
232a0 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72  3_str_append(&er
232b0 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a  rMsg, ", ", 2);.
232c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
232d0 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72  r_appendall(&err
232e0 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Msg, pTab->zName
232f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23300 5f 73 74 72 5f 61 70 70 65 6e 64 28 26 65 72 72  _str_append(&err
23310 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
23320 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
23330 61 70 70 65 6e 64 61 6c 6c 28 26 65 72 72 4d 73  appendall(&errMs
23340 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  g, zCol);.    }.
23350 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c    }.  zErr = sql
23360 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
23370 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73  sh(&errMsg);.  s
23380 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
23390 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20  aint(pParse, .  
233a0 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e    IsPrimaryKeyIn
233b0 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49  dex(pIdx) ? SQLI
233c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
233d0 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20  IMARYKEY .      
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43        : SQLITE_C
23400 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
23410 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a  ,.    onError, z
23420 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Err, P4_DYNAMIC,
23430 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
23440 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ique);.}.../*.**
23450 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
23460 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71   due to non-uniq
23470 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  ue rowid..*/.voi
23480 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f  d sqlite3RowidCo
23490 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
234a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
234b0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
234c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
234d0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c  r,      /* Confl
234e0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
234f0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61  lgorithm */.  Ta
23500 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20  ble *pTab       
23510 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74  /* The table wit
23520 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65  h the non-unique
23530 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20   rowid */ .){.  
23540 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
23550 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62  t rc;.  if( pTab
23560 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
23570 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
23580 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
23590 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
235a0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235c0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
235d0 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
235e0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
235f0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
23600 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c  RIMARYKEY;.  }el
23610 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  se{.    zMsg = s
23620 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
23630 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f  arse->db, "%s.ro
23640 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  wid", pTab->zNam
23650 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
23660 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
23670 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OWID;.  }.  sqli
23680 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
23690 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e  t(pParse, rc, on
236a0 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f  Error, zMsg, P4_
236b0 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20  DYNAMIC,.       
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
236e0 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ique);.}../*.** 
236f0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23700 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
23710 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
23720 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
23730 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
23740 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
23750 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
23760 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
23770 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
23780 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
23790 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
237a0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
237b0 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
237c0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
237d0 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
237e0 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
237f0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
23800 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
23810 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
23820 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
23830 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
23840 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
23850 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
23860 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
23870 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
23880 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
23890 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
238a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
238b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
238c0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
238d0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
238e0 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
238f0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
23900 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
23910 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
23920 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
23930 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
23940 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
23950 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
23960 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
23970 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
23980 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
23990 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
239a0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
239b0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
239c0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
239d0 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
239e0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
239f0 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
23a00 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
23a10 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
23a20 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
23a30 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
23a40 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
23a50 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
23a60 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
23a70 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
23a80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
23a90 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
23aa0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
23ab0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
23ac0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
23ad0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
23ae0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
23af0 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
23b00 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
23b10 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
23b20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
23b30 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
23b40 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
23b50 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
23b60 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
23b70 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
23b80 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
23b90 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
23ba0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
23bb0 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
23bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23bd0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
23be0 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
23bf0 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
23c00 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
23c10 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
23c20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23c30 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
23c40 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
23c50 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
23c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23c70 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
23c80 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
23c90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
23ca0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
23cb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
23cc0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
23cd0 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
23ce0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
23cf0 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
23d00 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
23d10 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
23d20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
23d30 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
23d40 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
23d50 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
23d60 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
23d70 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
23d80 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
23d90 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
23da0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
23db0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
23dc0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
23dd0 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
23de0 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
23df0 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
23e00 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
23e10 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
23e20 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
23e30 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
23e40 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
23e50 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
23e60 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
23e70 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
23e80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
23e90 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
23ea0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
23eb0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
23ec0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
23ed0 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
23f00 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
23f10 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
23f20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
23f30 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
23f40 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
23f50 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
23f60 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
23f70 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
23f80 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
23f90 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
23fa0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
23fb0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
23fc0 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
23fd0 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
23fe0 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
23ff0 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
24000 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
24010 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
24020 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
24030 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
24040 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
24050 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
24060 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
24070 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
24080 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
24090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
240a0 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
240b0 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
240c0 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
240d0 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
240e0 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
240f0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
24100 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
24110 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
24120 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
24130 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
24140 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
24150 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
24160 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
24170 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
24180 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
24190 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
241a0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
241b0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
241d0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
241e0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
241f0 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
24200 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
24210 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
24220 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
24230 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
24240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24250 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
24260 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
24270 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
24280 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
24290 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
242a0 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
242b0 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
242c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
242d0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
242e0 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
242f0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
24300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
24310 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
24320 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
24330 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
24340 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
24350 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
24360 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
24370 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
24380 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
24390 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
243a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
243b0 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
243c0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
243d0 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
243e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
243f0 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
24400 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
24410 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
24420 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
24430 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
24440 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
24450 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
24460 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
24470 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
24480 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
24490 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
244a0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
244b0 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
244c0 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
244d0 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
244e0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
244f0 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
24500 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
24510 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
24520 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
24530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24540 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
24550 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
24560 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
24570 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
24580 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
24590 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
245a0 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
245b0 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
245c0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
245d0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
245e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
245f0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
24600 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70  b].zDbSName;.  p
24610 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
24620 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44  dTable(db, z, zD
24630 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29  b);.  if( pTab )
24640 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62  {.    reindexTab
24650 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
24660 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
24670 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
24680 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
24690 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
246a0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
246b0 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
246c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
246d0 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a    if( pIndex ){.
246e0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
246f0 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
24700 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
24710 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
24720 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
24730 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
24740 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
24750 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24760 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
24770 20 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62   identify the ob
24780 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64  ject to be reind
24790 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  exed");.}.#endif
247a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
247b0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
247c0 72 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  re that is appro
247d0 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67  priate for the g
247e0 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  iven Index..**.*
247f0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  * The caller sho
24800 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  uld invoke sqlit
24810 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29  e3KeyInfoUnref()
24820 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   on the returned
24830 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20   object.** when 
24840 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  it has finished 
24850 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79  using it..*/.Key
24860 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
24870 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73  InfoOfIndex(Pars
24880 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
24890 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
248a0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
248b0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
248c0 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
248d0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49  >nKeyCol;.  KeyI
248e0 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28  nfo *pKey;.  if(
248f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
24900 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
24910 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
24920 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20  l ){.    pKey = 
24930 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
24940 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
24950 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29  nKey, nCol-nKey)
24960 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24970 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
24980 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
24990 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a  ->db, nCol, 0);.
249a0 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29    }.  if( pKey )
249b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
249c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
249d0 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b  iteable(pKey) );
249e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
249f0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
24a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
24a10 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
24a20 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65  ll[i];.      pKe
24a30 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  y->aColl[i] = zC
24a40 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42  oll==sqlite3StrB
24a50 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20  INARY ? 0 :.    
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74      sqlite3Locat
24a80 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
24a90 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70   zColl);.      p
24aa0 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
24ab0 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  i] = pIdx->aSort
24ac0 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a  Order[i];.    }.
24ad0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
24ae0 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 61 73  nErr ){.      as
24af0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 72 63  sert( pParse->rc
24b00 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 4d  ==SQLITE_ERROR_M
24b10 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45 51 20 29  ISSING_COLLSEQ )
24b20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
24b30 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30 20 29 7b  ->bNoQuery==0 ){
24b40 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 63  .        /* Deac
24b50 74 69 76 61 74 65 20 74 68 65 20 69 6e 64 65 78  tivate the index
24b60 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74   because it cont
24b70 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f 77 6e 20  ains an unknown 
24b80 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  collating.      
24b90 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 20    ** sequence.  
24ba0 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  The only way to 
24bb0 72 65 61 63 74 69 76 65 20 74 68 65 20 69 6e 64  reactive the ind
24bc0 65 78 20 69 73 20 74 6f 20 72 65 6c 6f 61 64 20  ex is to reload 
24bd0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
24be0 63 68 65 6d 61 2e 20 20 41 64 64 69 6e 67 20 74  chema.  Adding t
24bf0 68 65 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61  he missing colla
24c00 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6c 61  ting sequence la
24c10 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20  ter does not.   
24c20 20 20 20 20 20 2a 2a 20 72 65 61 63 74 69 76 65       ** reactive
24c30 20 74 68 65 20 69 6e 64 65 78 2e 20 20 54 68 65   the index.  The
24c40 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 68 61 64   application had
24c50 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 72   the chance to r
24c60 65 67 69 73 74 65 72 0a 20 20 20 20 20 20 20 20  egister.        
24c70 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e 67 20 69  ** the missing i
24c80 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 63  ndex using the c
24c90 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64 65 64 20  ollation-needed 
24ca0 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f 72 0a 20  callback.  For. 
24cb0 20 20 20 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69         ** simpli
24cc0 63 69 74 79 2c 20 53 51 4c 69 74 65 20 77 69 6c  city, SQLite wil
24cd0 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20 61  l not give the a
24ce0 70 70 6c 69 63 61 74 69 6f 6e 20 61 20 73 65 63  pplication a sec
24cf0 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20 20 20 20  ond chance..    
24d00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
24d10 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 20 3d 20  Idx->bNoQuery = 
24d20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
24d30 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
24d40 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20 20 20 20  RROR_RETRY;.    
24d50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
24d60 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
24d70 65 79 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 20  ey);.      pKey 
24d80 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
24d90 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.
24da0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24db0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20  OMIT_CTE./* .** 
24dc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24dd0 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72  invoked once per
24de0 20 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73   CTE by the pars
24df0 65 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67  er while parsing
24e00 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75   a .** WITH clau
24e10 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71  se. .*/.With *sq
24e20 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20  lite3WithAdd(.  
24e30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24e40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
24e50 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
24e60 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
24e70 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74          /* Exist
24e80 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c  ing WITH clause,
24e90 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
24ea0 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
24eb0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
24ec0 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c   the common-tabl
24ed0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
24ee0 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f  *pArglist,     /
24ef0 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  * Optional colum
24f00 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20  n name list for 
24f10 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  the table */.  S
24f20 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20  elect *pQuery   
24f30 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20         /* Query 
24f40 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
24f50 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ze the table */.
24f60 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24f70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
24f80 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63   With *pNew;.  c
24f90 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f  har *zName;..  /
24fa0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
24fb0 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69   CTE name is uni
24fc0 71 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  que within this 
24fd0 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a  WITH clause. If.
24fe0 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20    ** not, store 
24ff0 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
25000 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
25010 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
25020 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
25030 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
25040 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
25050 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20  me && pWith ){. 
25060 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
25070 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
25080 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
25090 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
250a0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74  ICmp(zName, pWit
250b0 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  h->a[i].zName)==
250c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
250d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
250e0 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
250f0 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a  WITH table name:
25100 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
25110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25120 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
25130 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
25140 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b  sizeof(*pWith) +
25150 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e   (sizeof(pWith->
25160 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e  a[1]) * pWith->n
25170 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Cte);.    pNew =
25180 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
25190 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79  c(db, pWith, nBy
251a0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
251b0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
251c0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
251d0 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29   sizeof(*pWith))
251e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
251f0 28 70 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d  (pNew!=0 && zNam
25200 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  e!=0) || db->mal
25210 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
25220 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
25230 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
25240 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
25250 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b  e(db, pArglist);
25260 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
25270 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75  ctDelete(db, pQu
25280 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
25290 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
252a0 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70  e);.    pNew = p
252b0 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  With;.  }else{. 
252c0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
252d0 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d  >nCte].pSelect =
252e0 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65   pQuery;.    pNe
252f0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
25300 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73  .pCols = pArglis
25310 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  t;.    pNew->a[p
25320 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65  New->nCte].zName
25330 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e   = zName;.    pN
25340 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
25350 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ].zCteErr = 0;. 
25360 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b     pNew->nCte++;
25370 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
25380 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
25390 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
253a0 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  of the With obje
253b0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
253c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
253d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
253e0 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69  3WithDelete(sqli
253f0 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
25400 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69  With){.  if( pWi
25410 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
25420 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25430 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
25440 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
25450 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69  Cte *pCte = &pWi
25460 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  th->a[i];.      
25470 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
25480 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
25490 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  pCols);.      sq
254a0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
254b0 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  e(db, pCte->pSel
254c0 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
254d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
254e0 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
254f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
25500 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a  ree(db, pWith);.
25510 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
25520 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
25530 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a           OMIT_CTE) */.