/ Hex Artifact Content
Login

Artifact ddcce07ea58f569da879e6fb3f4366dd66125edb6c2a41249a39fc72b01d456e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20  */.  int iTab;  
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77     /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73  rite lock.  Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63  e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  k */.  const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a  r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20  that we want to 
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20  lock a table at 
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a  run-time.  .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62  * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f  e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20  t page iTab and 
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61  is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72  base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c  ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e  ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73   depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66  st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63  act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54  k is desired.  T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61  he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75  ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74  y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f  o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75  cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e  3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72  TableLock(.  Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f  sWriteLock,    /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69  * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e  te lock */.  con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20  d */.){.  Parse 
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  l(pParse);.  int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73   i;.  int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70  ;.  TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62  =0 );..  if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==1 ) return;.  
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65  if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65  eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Bt) ) return;.  
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c  for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62  &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26  f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20  & p->iTab==iTab 
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72  ){.      p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73  iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57  WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  riteLock);.     
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73   }..  nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29  izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e   * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20  TableLock+1);.  
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c  pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71  eLock =.      sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61  db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65  TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  s);.  if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20  vel->aTableLock 
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70  ){.    p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61  k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b  ck;.    p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c  }else{.    pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b  evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65  3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a  vel->db);.  }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74  P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79   table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79  t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a  3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72  deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56  nt i;.  Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d  dbe; ..  pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f  t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44   cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ated */..  for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70      TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62   = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69  leLock[i];.    i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a  nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f  ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70  TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69  ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  teLock,.        
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53  >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f   given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d  bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20   if it contains 
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54  no.** 1 bits.  T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73  sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44  kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a  bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51  * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44  >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62  bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69  Mask m){.  int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20  izeof(yDbMask); 
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20  i++) if( m[i] ) 
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  er a single SQL 
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64  en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20   a VDBE program 
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65  statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20  en.** prepared. 
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75   This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67  ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a   touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  ** VDBE program 
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70  and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20  Parse structure 
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72  e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20  or occurred, it 
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42  e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72  E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20  Toplevel==0 );. 
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b  nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69  e->nErr ){.    i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53  f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73  QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20  n by generating 
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e  some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64   code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62   of the.  ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20  e program.  */. 
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e  ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20  isMultiWrite .  
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56       || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79  t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76  Abort));.  if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49  Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70  CATION.    if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63  Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20  Init(db);.      
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61  rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a  uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48  rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72  _USER;.        r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65  +){.        Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20  ma *pSchema;.   
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54       if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  .pSchema;.      
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20  Op4Int(v,.      
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69      OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65         /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44   */.          iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20   /* P1 */.      
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70      DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a  ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  P3 */.          
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61  pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20     /* P4 */.    
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20  ment((v,.       
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74         "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61  Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26  rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69   pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d  Write));.      }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  E.      for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62   i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d      char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50  GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b  arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20  VTAB);.      }. 
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74       pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  rse);..      /* 
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41  Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74  UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71  a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  uired..      */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28  oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74  /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64  t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f   out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ops */.      if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  xpr ){.        E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70  xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  r;.        pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45  r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74  L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20  ExprReg);.      
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29  e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72  .  if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21  se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e   ){.    /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73  imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69  or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53  is used.    *  S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33  ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20  79c1f08866] */. 
1ca0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1cb0: 65 2d 3e 70 41 69 6e 63 3d 3d 30 20 7c 7c 20 70  e->pAinc==0 || p
1cc0: 50 61 72 73 65 2d 3e 6e 54 61 62 3e 30 20 29 3b  Parse->nTab>0 );
1cd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1cf0: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1d00: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1d10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d20: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1d30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1d50: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1d60: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1d70: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1d80: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1d90: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1da0: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1db0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1dc0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1dd0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1de0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1df0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1e00: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1e10: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1e20: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1e30: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1e40: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1e50: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1e60: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1e70: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1e80: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1e90: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1ea0: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1eb0: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1ec0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1ed0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1ee0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1ef0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1f00: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1f10: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
1f20: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1f30: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1f40: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1f50: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1f60: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1f70: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1f80: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1f90: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fa0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1fc0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1fd0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1fe0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ff0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
2000: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
2010: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2020: 3e 64 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65  >db;.  char save
2030: 42 75 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53  Buf[PARSE_TAIL_S
2040: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
2050: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
2060: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2070: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
2080: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
2090: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
20a0: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
20b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
20c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
20d0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
20e0: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
20f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2100: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
2110: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
2120: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
2130: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
2140: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
2150: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
2160: 79 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45  y(saveBuf, PARSE
2170: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50  _TAIL(pParse), P
2180: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
2190: 20 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41   memset(PARSE_TA
21a0: 49 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50  IL(pParse), 0, P
21b0: 41 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20  ARSE_TAIL_SZ);. 
21c0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21d0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2200: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2220: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52  l);.  memcpy(PAR
2230: 53 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c  SE_TAIL(pParse),
2240: 20 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f   saveBuf, PARSE_
2250: 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72  TAIL_SZ);.  pPar
2260: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
2270: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
2280: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2290: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22a0: 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74  E if zTable is t
22b0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
22c0: 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74  ystem table that
22d0: 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c   stores the.** l
22e0: 69 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64  ist of users and
22f0: 20 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72   their access cr
2300: 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e  edentials..*/.in
2310: 74 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74  t sqlite3UserAut
2320: 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61  hTable(const cha
2330: 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65  r *zTable){.  re
2340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72  turn sqlite3_str
2350: 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  icmp(zTable, "sq
2360: 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a  lite_user")==0;.
2370: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2380: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2390: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
23a0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
23b0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
23c0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
23d0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
23e0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
23f0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
2400: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
2410: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2420: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2430: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2440: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2450: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2460: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2470: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2480: 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68  the table and th
2490: 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68  e.** first match
24a0: 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74  ing table is ret
24b0: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
24c0: 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61  king for duplica
24d0: 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  te table.** name
24e0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
24f0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2500: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
2510: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
2520: 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61  .** auxiliary da
2530: 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73  tabases added us
2540: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
2550: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  ommand..**.** Se
2560: 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f  e also sqlite3Lo
2570: 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a  cateTable()..*/.
2580: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69  Table *sqlite3Fi
2590: 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  ndTable(sqlite3 
25a0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
25b0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
25c0: 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a  ar *zDatabase){.
25d0: 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a    Table *p = 0;.
25e0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
25f0: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
2600: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
2610: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2620: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2630: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2640: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2650: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2660: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2670: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55   );.#if SQLITE_U
2680: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2690: 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  ON.  /* Only the
26a0: 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61   admin user is a
26b0: 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74  llowed to know t
26c0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75  hat the sqlite_u
26d0: 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65  ser table.  ** e
26e0: 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64  xists */.  if( d
26f0: 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65  b->auth.authLeve
2700: 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26  l<UAUTH_Admin &&
2710: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
2720: 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20  Table(zName)!=0 
2730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
2750: 69 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28  ile(1){.    for(
2760: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
2770: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
2780: 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69        int j = (i
2790: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
27a0: 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20   /* Search TEMP 
27b0: 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20  before MAIN */. 
27c0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61       if( zDataba
27d0: 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
27e0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
27f0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44  e, db->aDb[j].zD
2800: 62 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  bSName)==0 ){.  
2810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2820: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
2830: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
2840: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71  ;.        p = sq
2850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
2860: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2870: 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d  a->tblHash, zNam
2880: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2890: 70 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20  p ) return p;.  
28a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28b0: 2f 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49  /* Not found.  I
28c0: 66 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65  f the name we we
28d0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77  re looking for w
28e0: 61 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d  as temp.sqlite_m
28f0: 61 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65  aster.    ** the
2900: 6e 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d  n change the nam
2910: 65 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70  e to sqlite_temp
2920: 5f 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20  _master and try 
2930: 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
2940: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2950: 28 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  (zName, MASTER_N
2960: 41 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  AME)!=0 ) break;
2970: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2980: 5f 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61  _stricmp(zDataba
2990: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  se, db->aDb[1].z
29a0: 44 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72  DbSName)!=0 ) br
29b0: 65 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  eak;.    zName =
29c0: 20 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d   TEMP_MASTER_NAM
29d0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
29e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  0;.}../*.** Loca
29f0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a10: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a20: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a30: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a50: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a60: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2a70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2a80: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2a90: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2aa0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ab0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2ac0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2ad0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2ae0: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2af0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b00: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b10: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b20: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b30: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b40: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b50: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b60: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2b70: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2b80: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2b90: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2ba0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2bb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2bd0: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2be0: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2bf0: 0a 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20  .  u32 flags,   
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43            /* LOC
2c10: 41 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41  ATE_VIEW or LOCA
2c20: 54 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f  TE_NOERR */.  co
2c30: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2c40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c50: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2c60: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
2c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c80: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
2c90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ca0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
2cb0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
2cc0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
2cd0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
2ce0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2cf0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2d00: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d10: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2d20: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2d30: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2d40: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2d50: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d  L. */.  if( (db-
2d60: 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c  >mDbFlags & DBFL
2d70: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
2d80: 29 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49  )==0 .   && SQLI
2d90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2da0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2db0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2dc0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73   0;.  }..  p = s
2dd0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2de0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73  db, zName, zDbas
2df0: 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  e);.  if( p==0 )
2e00: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2e10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2e20: 4c 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  LE.    /* If zNa
2e30: 6d 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68  me is the not th
2e40: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
2e50: 65 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  e in the schema 
2e60: 63 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20  created using.  
2e70: 20 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65    ** CREATE, the
2e80: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
2e90: 66 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65  f it is the name
2ea0: 20 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74   of an virtual t
2eb0: 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  able that.    **
2ec0: 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79   can be an epony
2ed0: 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62  mous virtual tab
2ee0: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  le. */.    if( p
2ef0: 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74  Parse->disableVt
2f00: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ab==0 ){.      M
2f10: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
2f20: 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61  odule*)sqlite3Ha
2f30: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64  shFind(&db->aMod
2f40: 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ule, zName);.   
2f50: 20 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26     if( pMod==0 &
2f60: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
2f70: 6d 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d  mp(zName, "pragm
2f80: 61 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  a_", 7)==0 ){.  
2f90: 20 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c        pMod = sql
2fa0: 69 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65  ite3PragmaVtabRe
2fb0: 67 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65  gister(db, zName
2fc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2fd0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
2fe0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
2ff0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
3000: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
3010: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3020: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3030: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3040: 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c     if( flags & L
3050: 4f 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65  OCATE_NOERR ) re
3060: 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72  turn 0;.    pPar
3070: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
3080: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
3090: 20 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26   IsVirtual(p) &&
30a0: 20 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65   pParse->disable
30b0: 56 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20  Vtab ){.    p = 
30c0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d  0;.  }..  if( p=
30d0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
30e0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61  char *zMsg = fla
30f0: 67 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57  gs & LOCATE_VIEW
3100: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
3110: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
3120: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
3130: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
3140: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3150: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
3160: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
3170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
3180: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3190: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
31a0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
31b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
31c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
31d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
31e0: 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
31f0: 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a  fied by *p..**.*
3200: 2a 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70  * This is a wrap
3210: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
3220: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
3230: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
3240: 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74  between.** sqlit
3250: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20  e3LocateTable() 
3260: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
3270: 6e 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  n is that this f
3280: 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74  unction restrict
3290: 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20  s.** the search 
32a0: 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53  to schema (p->pS
32b0: 63 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20  chema) if it is 
32c0: 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63  not NULL. p->pSc
32d0: 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e  hema may be.** n
32e0: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  on-NULL if it is
32f0: 20 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20   part of a view 
3300: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
3310: 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53  am definition. S
3320: 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78  ee.** sqlite3Fix
3330: 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65  SrcList() for de
3340: 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20  tails..*/.Table 
3350: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
3360: 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65  bleItem(.  Parse
3370: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32   *pParse, .  u32
3380: 20 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74   flags,.  struct
3390: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
33a0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
33b0: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
33c0: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
33d0: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
33e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
33f0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
3400: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
3410: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
3420: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
3430: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
3440: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
3450: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
3460: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d  }else{.    zDb =
3470: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20   p->zDatabase;. 
3480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3490: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70  te3LocateTable(p
34a0: 50 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d  Parse, flags, p-
34b0: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a  >zName, zDb);.}.
34c0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
34d0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
34e0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
34f0: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
3500: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
3510: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3520: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
3530: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3540: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
3550: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3560: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3570: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
3580: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
3590: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
35a0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
35b0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
35c0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
35d0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
35e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
35f0: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
3600: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
3610: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
3620: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
3630: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
3640: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
3650: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
3660: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
3670: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
3680: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
3690: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
36a0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
36b0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
36c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
36d0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
36e0: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
36f0: 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c   int i;.  /* All
3700: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
3710: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
3720: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
3730: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
3740: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
3750: 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Db!=0 || sqlite3
3760: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
3770: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f  exes(db) );.  fo
3780: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
3790: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
37a0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
37b0: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
37c0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
37d0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
37e0: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
37f0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  a = db->aDb[j].p
3800: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
3810: 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20  rt( pSchema );. 
3820: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
3830: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
3840: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
3850: 53 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  SName) ) continu
3860: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
3870: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
3880: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
3890: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
38a0: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
38b0: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
38c0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
38d0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
38e0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
38f0: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
3900: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
3910: 69 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71  index.*/.void sq
3920: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73  lite3FreeIndex(s
3930: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
3940: 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
3950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
3960: 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  ZE.  sqlite3Dele
3970: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
3980: 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, p);.#endif.  
3990: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
39a0: 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64  e(db, p->pPartId
39b0: 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  xWhere);.  sqlit
39c0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
39d0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72  (db, p->aColExpr
39e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
39f0: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
3a00: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
3a10: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
3a20: 44 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64  DbFree(db, (void
3a30: 20 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23   *)p->azColl);.#
3a40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3a50: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
3a60: 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  T4.  sqlite3_fre
3a70: 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a  e(p->aiRowEst);.
3a80: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3a90: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3aa0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3ab0: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
3ac0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
3ad0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
3ae0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
3af0: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
3b00: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
3b10: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
3b20: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
3b30: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
3b40: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
3b50: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
3b60: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
3b70: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3b90: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3ba0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3bb0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3bc0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3bd0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3be0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
3bf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c00: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3c10: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3c20: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
3c30: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
3c40: 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e 64  >idxHash;.  pInd
3c50: 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ex = sqlite3Hash
3c60: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49  Insert(pHash, zI
3c70: 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66  dxName, 0);.  if
3c80: 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29  ( ALWAYS(pIndex)
3c90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
3ca0: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3cb0: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
3cc0: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
3cd0: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
3ce0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3cf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
3d00: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20  ex *p;.      /* 
3d10: 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66  Justification of
3d20: 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20   ALWAYS();  The 
3d30: 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e  index must be on
3d40: 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20   the list of.   
3d50: 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a     ** indices. *
3d60: 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64  /.      p = pInd
3d70: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3d80: 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
3d90: 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d   ALWAYS(p) && p-
3da0: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29  >pNext!=pIndex )
3db0: 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20  { p = p->pNext; 
3dc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
3dd0: 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74  YS(p && p->pNext
3de0: 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  ==pIndex) ){.   
3df0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
3e00: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
3e10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3e20: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
3e30: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
3e40: 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67   }.  db->mDbFlag
3e50: 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65  s |= DBFLAG_Sche
3e60: 6d 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  maChange;.}../*.
3e70: 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20  ** Look through 
3e80: 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e  the list of open
3e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
3ea0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64  in db->aDb[] and
3eb0: 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20   if.** any have 
3ec0: 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d  been closed, rem
3ed0: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
3ee0: 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63  e list.  Realloc
3ef0: 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61  ate the.** db->a
3f00: 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74  Db[] structure t
3f10: 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65  o a smaller size
3f20: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  , if possible..*
3f30: 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68  *.** Entry 0 (th
3f40: 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73  e "main" databas
3f50: 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28  e) and entry 1 (
3f60: 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62  the "temp" datab
3f70: 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65  ase).** are neve
3f80: 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  r candidates for
3f90: 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64   being collapsed
3fa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3fb0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3fc0: 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  eArray(sqlite3 *
3fd0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  db){.  int i, j;
3fe0: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3ff0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4000: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
4010: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
4020: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
4030: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
4040: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4050: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 3b 0a  pDb->zDbSName);.
4060: 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
4070: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
4080: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
4090: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
40a0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
40b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
40c0: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
40d0: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20    db->nDb = j;. 
40e0: 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20   if( db->nDb<=2 
40f0: 26 26 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e  && db->aDb!=db->
4100: 61 44 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20  aDbStatic ){.   
4110: 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53   memcpy(db->aDbS
4120: 74 61 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20  tatic, db->aDb, 
4130: 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  2*sizeof(db->aDb
4140: 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  [0]));.    sqlit
4150: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
4160: 3e 61 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61  >aDb);.    db->a
4170: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
4180: 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ic;.  }.}../*.**
4190: 20 52 65 73 65 74 20 74 68 65 20 73 63 68 65 6d   Reset the schem
41a0: 61 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  a for the databa
41b0: 73 65 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e  se at index iDb.
41c0: 20 20 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65    Also reset the
41d0: 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e  .** TEMP schema.
41e0: 20 20 54 68 65 20 72 65 73 65 74 20 69 73 20 64    The reset is d
41f0: 65 66 65 72 72 65 64 20 69 66 20 64 62 2d 3e 6e  eferred if db->n
4200: 53 63 68 65 6d 61 4c 6f 63 6b 20 69 73 20 6e 6f  SchemaLock is no
4210: 74 20 7a 65 72 6f 2e 0a 2a 2a 20 44 65 66 65 72  t zero..** Defer
4220: 72 65 64 20 72 65 73 65 74 73 20 6d 61 79 20 62  red resets may b
4230: 65 20 72 75 6e 20 62 79 20 63 61 6c 6c 69 6e 67  e run by calling
4240: 20 77 69 74 68 20 69 44 62 3c 30 2e 0a 2a 2f 0a   with iDb<0..*/.
4250: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
4260: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
4270: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
4280: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
4290: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
42a0: 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 3e 3d   );..  if( iDb>=
42b0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
42c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
42d0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
42e0: 20 30 29 20 29 3b 0a 20 20 20 20 44 62 53 65 74   0) );.    DbSet
42f0: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 44 62  Property(db, iDb
4300: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4310: 29 3b 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70  );.    DbSetProp
4320: 65 72 74 79 28 64 62 2c 20 31 2c 20 44 42 5f 52  erty(db, 1, DB_R
4330: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20  esetWanted);.   
4340: 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d   db->mDbFlags &=
4350: 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b   ~DBFLAG_SchemaK
4360: 6e 6f 77 6e 4f 6b 3b 0a 20 20 7d 0a 0a 20 20 69  nownOk;.  }..  i
4370: 66 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f  f( db->nSchemaLo
4380: 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ck==0 ){.    for
4390: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
43a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
43b0: 20 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64   DbHasProperty(d
43c0: 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57 61  b, i, DB_ResetWa
43d0: 6e 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  nted) ){.       
43e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
43f0: 65 61 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ear(db->aDb[i].p
4400: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d  Schema);.      }
4410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
4420: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
4430: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
4440: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
4450: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
4460: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
4470: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
4480: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
4490: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
44a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
44b0: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
44c0: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
44d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
44e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
44f0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
4500: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
4510: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
4520: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
4530: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
4540: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
4550: 20 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68 65     if( db->nSche
4560: 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  maLock==0 ){.   
4570: 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65       sqlite3Sche
4580: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
4590: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  hema);.      }el
45a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 44 62 53 65  se{.        DbSe
45b0: 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c  tProperty(db, i,
45c0: 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29   DB_ResetWanted)
45d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
45e0: 20 20 7d 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61    }.  db->mDbFla
45f0: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
4600: 63 68 65 6d 61 43 68 61 6e 67 65 7c 44 42 46 4c  chemaChange|DBFL
4610: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b  AG_SchemaKnownOk
4620: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  );.  sqlite3Vtab
4630: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4640: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4650: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 69 66  aveAll(db);.  if
4660: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63  ( db->nSchemaLoc
4670: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  k==0 ){.    sqli
4680: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4690: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
46a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
46b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46c0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
46d0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
46e0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
46f0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
4700: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
4710: 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42  >mDbFlags &= ~DB
4720: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
4730: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  e;.}../*.** Dele
4740: 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  te memory alloca
4750: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ted for the colu
4760: 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61  mn names of a ta
4770: 62 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65  ble or view (the
4780: 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d  .** Table.aCol[]
4790: 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64   array)..*/.void
47a0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f   sqlite3DeleteCo
47b0: 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65  lumnNames(sqlite
47c0: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
47d0: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
47e0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
47f0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
4800: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
4810: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
4820: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
4830: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
4840: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
4850: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4860: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4870: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4880: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4890: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
48a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
48b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
48c0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
48d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
48e0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
48f0: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4900: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4910: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4920: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4930: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4940: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4950: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4960: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
4970: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
4980: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
4990: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
49a0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
49b0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
49c0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
49d0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
49e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
49f0: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4a00: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4a10: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4a20: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4a30: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4a40: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4a50: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4a60: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
4a70: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
4a80: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
4a90: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
4aa0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
4ab0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
4ac0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4ad0: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4ae0: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4af0: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4b00: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4b10: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4b20: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4b30: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4b40: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4b50: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4b60: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
4b70: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
4b80: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
4b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
4ba0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 64 65 6c  ITE_NOINLINE del
4bb0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4bc0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4bd0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4be0: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 0a  Index, *pNext;..
4bf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4c00: 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  BUG.  /* Record 
4c10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
4c20: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73  tstanding lookas
4c30: 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ide allocations 
4c40: 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  in schema Tables
4c50: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64  .  ** prior to d
4c60: 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20  oing any free() 
4c70: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e  operations.  Sin
4c80: 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  ce schema Tables
4c90: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a   do not use.  **
4ca0: 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73   lookaside, this
4cb0: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e   number should n
4cc0: 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20  ot change. */.  
4cd0: 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  int nLookaside =
4ce0: 20 30 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20   0;.  if( db && 
4cf0: 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67  (pTable->tabFlag
4d00: 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
4d10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4c 6f 6f  )==0 ){.    nLoo
4d20: 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 74 65 33  kaside = sqlite3
4d30: 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62  LookasideUsed(db
4d40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
4d50: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4d60: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4d70: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
4d80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
4d90: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
4da0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
4db0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
4dc0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
4dd0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4de0: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4df0: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4e00: 53 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20  Schema.         
4e10: 7c 7c 20 28 49 73 56 69 72 74 75 61 6c 28 70 54  || (IsVirtual(pT
4e20: 61 62 6c 65 29 20 26 26 20 70 49 6e 64 65 78 2d  able) && pIndex-
4e30: 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45  >idxType!=SQLITE
4e40: 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29  _IDXTYPE_APPDEF)
4e50: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 64 62 3d   );.    if( (db=
4e60: 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  =0 || db->pnByte
4e70: 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 21 49  sFreed==0) && !I
4e80: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
4e90: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
4ea0: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
4eb0: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
4ec0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
4ed0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4ee0: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4ef0: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4f00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4f10: 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29  zName, 0.      )
4f20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4f30: 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  db==0 || sqlite3
4f40: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
4f50: 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
4f60: 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20  Schema) );.     
4f70: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70   assert( pOld==p
4f80: 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30  Index || pOld==0
4f90: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
4fa0: 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 64  lite3FreeIndex(d
4fb0: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4fc0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4fd0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4fe0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4ff0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
5000: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
5010: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
5020: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
5030: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
5040: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
5050: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
5060: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
5070: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5080: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
5090: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
50a0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
50b0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
50c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
50d0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
50e0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
50f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5100: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
5110: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5120: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5130: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5140: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5150: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5160: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5170: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5180: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5190: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
51a0: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
51b0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
51c0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
51d0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
51e0: 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 69 64 65  sqlite3Lookaside
51f0: 55 73 65 64 28 64 62 2c 30 29 20 29 3b 0a 7d 0a  Used(db,0) );.}.
5200: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
5210: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
5220: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
5230: 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  le){.  /* Do not
5240: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
5250: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
5260: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
5270: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
5280: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
5290: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
52a0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
52b0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
52c0: 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 66 29 3e  Table->nTabRef)>
52d0: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
52e0: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
52f0: 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Table);.}.../*.*
5300: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
5310: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
5320: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
5330: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
5340: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5350: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5360: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5370: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5380: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5390: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
53a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
53b0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
53c0: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
53d0: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
53e0: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
53f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5400: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
5410: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
5420: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
5430: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5440: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5450: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5460: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5470: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5480: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5490: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
54a0: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
54b0: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
54c0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
54d0: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
54e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
54f0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
5500: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
5510: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
5520: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
5530: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5550: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
5560: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
5570: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
5580: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
5590: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
55a0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
55b0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
55c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
55d0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
55e0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
55f0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
5600: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5610: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
5620: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
5630: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
5640: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
5650: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
5660: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
5670: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
5680: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
5690: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
56a0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
56b0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
56c0: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
56d0: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
56e0: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
56f0: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
5700: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
5710: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
5720: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
5730: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
5740: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
5750: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
5760: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5770: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
5780: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
5790: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
57a0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
57b0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
57c0: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
57d0: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
57e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  (zName);.  }else
57f0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b  {.    zName = 0;
5800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
5810: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ame;.}../*.** Op
5820: 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  en the sqlite_ma
5830: 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65  ster table store
5840: 64 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75  d in database nu
5850: 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20  mber iDb for.** 
5860: 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62  writing. The tab
5870: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69  le is opened usi
5880: 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a  ng cursor 0..*/.
5890: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e  void sqlite3Open
58a0: 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73  MasterTable(Pars
58b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a  e *p, int iDb){.
58c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
58d0: 74 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20  te3GetVdbe(p);. 
58e0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
58f0: 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52  k(p, iDb, MASTER
5900: 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 54 45 52  _ROOT, 1, MASTER
5910: 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c 69 74 65  _NAME);.  sqlite
5920: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5930: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5940: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5950: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5960: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5970: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
5980: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
5990: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
59a0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
59b0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
59c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
59d0: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
59e0: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
59f0: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5a00: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5a10: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5a20: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5a30: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5a40: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5a50: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5a60: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5a70: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
5a80: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a90: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
5aa0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
5ab0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
5ac0: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
5ad0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5ae0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5af0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5b00: 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  pDb;.    for(i=(
5b10: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5b20: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5b30: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5b40: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
5b50: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 44 62  ite3_stricmp(pDb
5b60: 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a 4e 61 6d  ->zDbSName, zNam
5b70: 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  e) ) break;.    
5b80: 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 73 20 61    /* "main" is a
5b90: 6c 77 61 79 73 20 61 6e 20 61 63 63 65 70 74 61  lways an accepta
5ba0: 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 20 74 68  ble alias for th
5bb0: 65 20 70 72 69 6d 61 72 79 20 64 61 74 61 62 61  e primary databa
5bc0: 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  se.      ** even
5bd0: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
5be0: 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 20 53 51  renamed using SQ
5bf0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41  LITE_DBCONFIG_MA
5c00: 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a 20 20 20  INDBNAME. */.   
5c10: 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 30     if( i==0 && 0
5c20: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
5c30: 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  p("main", zName)
5c40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
5c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
5c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
5c70: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
5c80: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
5c90: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
5ca0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
5cb0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5cc0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5cd0: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
5ce0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
5cf0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
5d00: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5d10: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
5d20: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5d30: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
5d40: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
5d50: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
5d60: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
5d70: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Name){.  int i; 
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5da0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
5db0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
5dc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
5de0: 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68  me we are search
5df0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61  ing for */.  zNa
5e00: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
5e10: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
5e20: 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69  ame);.  i = sqli
5e30: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
5e40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
5e50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
5e60: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  ame);.  return i
5e70: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c  ;.}../* The tabl
5e80: 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69  e or view or tri
5e90: 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73  gger name is pas
5ea0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
5eb0: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a  ine via tokens.*
5ec0: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5ed0: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5ee0: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5ef0: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5f00: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43  example:.**.** C
5f10: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
5f20: 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a  yyy (...);.** .*
5f30: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5f40: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
5f50: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
5f60: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
5f70: 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  d if.** the tabl
5f80: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5f90: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5fa0: 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  .e.:.**.** CREAT
5fb0: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
5fc0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  ;.**.** Then pNa
5fd0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5fe0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5ff0: 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  s ""..**.** This
6000: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
6010: 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e  e *ppUnqual poin
6020: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6030: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
6040: 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20  1 or.** pName2) 
6050: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
6060: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
6070: 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64  e name.  The ind
6080: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ex of the.** dat
6090: 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72  abase "xxx" is r
60a0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
60b0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
60c0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
60d0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
60e0: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
60f0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
6100: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
6110: 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me1,      /* The
6120: 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61   "xxx" in the na
6130: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20  me "xxx.yyy" or 
6140: 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  "xxx" */.  Token
6150: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f   *pName2,      /
6160: 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74  * The "yyy" in t
6170: 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79  he name "xxx.yyy
6180: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70  " */.  Token **p
6190: 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72  Unqual     /* Wr
61a0: 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66  ite the unqualif
61b0: 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ied object name 
61c0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
61d0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
61e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
61f0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
6200: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
6210: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6220: 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74  e->db;..  assert
6230: 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 3b 0a 20  ( pName2!=0 );. 
6240: 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30   if( pName2->n>0
6250: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
6260: 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20  init.busy ) {.  
6270: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6280: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
6290: 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b  rupt database");
62a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
62b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
62c0: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
62d0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
62e0: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
62f0: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
6300: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
6310: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6320: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
6330: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
6340: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6350: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  -1;.    }.  }els
6360: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
6370: 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c  b->init.iDb==0 |
6380: 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  | db->init.busy 
6390: 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  || IN_RENAME_OBJ
63a0: 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  ECT.            
63b0: 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67   || (db->mDbFlag
63c0: 73 20 26 20 44 42 46 4c 41 47 5f 56 61 63 75 75  s & DBFLAG_Vacuu
63d0: 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 44 62 20  m)!=0);.    iDb 
63e0: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
63f0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6400: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6410: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6420: 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d 41  * True if PRAGMA
6430: 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
6440: 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74 20 73 71   is ON.*/.int sq
6450: 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63 68  lite3WritableSch
6460: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ema(sqlite3 *db)
6470: 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64  {.  testcase( (d
6480: 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45  b->flags&(SQLITE
6490: 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c  _WriteSchema|SQL
64a0: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d  ITE_Defensive))=
64b0: 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
64c0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  ( (db->flags&(SQ
64d0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
64e0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
64f0: 65 29 29 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  e))==.          
6500: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 72 69 74       SQLITE_Writ
6510: 65 53 63 68 65 6d 61 20 29 3b 0a 20 20 74 65 73  eSchema );.  tes
6520: 74 63 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67  tcase( (db->flag
6530: 73 26 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53  s&(SQLITE_WriteS
6540: 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66  chema|SQLITE_Def
6550: 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20  ensive))==.     
6560: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6570: 5f 44 65 66 65 6e 73 69 76 65 20 29 3b 0a 20 20  _Defensive );.  
6580: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
6590: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
65a0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
65b0: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
65d0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
65e0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
65f0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  e) );.  return (
6600: 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54  db->flags&(SQLIT
6610: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51  E_WriteSchema|SQ
6620: 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29  LITE_Defensive))
6630: 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  ==SQLITE_WriteSc
6640: 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hema;.}../*.** T
6650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
6660: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
6670: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
6680: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
6690: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
66a0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
66b0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
66c0: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
66d0: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
66e0: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
66f0: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
6700: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
6710: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
6720: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
6730: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
6740: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
6750: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
6760: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
6770: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6780: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
6790: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
67a0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
67b0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
67c0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
67d0: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
67e0: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
67f0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
6800: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
6810: 74 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d  te3WritableSchem
6820: 61 28 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  a(pParse->db)==0
6830: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
6840: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
6850: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6860: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
6870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6880: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
6890: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
68a0: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
68b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
68c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
68d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
68e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
68f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
6900: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
6910: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
6920: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
6930: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
6940: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
6950: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
6960: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
6970: 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  & !IsPrimaryKeyI
6980: 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e  ndex(p); p=p->pN
6990: 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  ext){}.  return 
69a0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
69b0: 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  rn the column of
69c0: 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61 74   index pIdx that
69d0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
69e0: 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  table.** column 
69f0: 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31  iCol.  Return -1
6a00: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
6a10: 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c  /.i16 sqlite3Col
6a20: 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78  umnOfIndex(Index
6a30: 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c   *pIdx, i16 iCol
6a40: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
6a50: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
6a60: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
6a70: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78    if( iCol==pIdx
6a80: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20  ->aiColumn[i] ) 
6a90: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
6aa0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
6ab0: 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72  .** Begin constr
6ac0: 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  ucting a new tab
6ad0: 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
6ae0: 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  n in memory.  Th
6af0: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72  is is.** the fir
6b00: 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63  st of several ac
6b10: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68  tion routines th
6b20: 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e  at get called in
6b30: 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20   response.** to 
6b40: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
6b50: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61  tatement.  In pa
6b60: 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72  rticular, this r
6b70: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
6b80: 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67  .** after seeing
6b90: 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22   tokens "CREATE"
6ba0: 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64   and "TABLE" and
6bb0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e   the table name.
6bc0: 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66   The isTemp.** f
6bd0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
6be0: 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  he table should 
6bf0: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  be stored in the
6c00: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
6c10: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  ase.** file inst
6c20: 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61  ead of in the ma
6c30: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
6c40: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
6c50: 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  lly the case.** 
6c60: 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20  when the "TEMP" 
6c70: 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b  or "TEMPORARY" k
6c80: 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e  eyword occurs in
6c90: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41   between.** CREA
6ca0: 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a  TE and TABLE..**
6cb0: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c  .** The new tabl
6cc0: 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74  e record is init
6cd0: 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20  ialized and put 
6ce0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  in pParse->pNewT
6cf0: 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65  able..** As more
6d00: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6d10: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
6d20: 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74 69  s parsed, additi
6d30: 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72  onal action.** r
6d40: 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20  outines will be 
6d50: 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f  called to add mo
6d60: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
6d70: 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a  o this record..*
6d80: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
6d90: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
6da0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
6db0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6dc0: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  ) routine.** is 
6dd0: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65  called to comple
6de0: 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  te the construct
6df0: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ion of the new t
6e00: 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a  able record..*/.
6e10: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61 72  void sqlite3Star
6e20: 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  tTable(.  Parse 
6e30: 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
6e40: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
6e50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
6e60: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
6e70: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6e80: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6e90: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
6ea0: 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e  ame2,   /* Secon
6eb0: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  d part of the na
6ec0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6ed0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  or view */.  int
6ee0: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a   isTemp,      /*
6ef0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6f00: 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f   a TEMP table */
6f10: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
6f20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6f30: 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f  his is a VIEW */
6f40: 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c  .  int isVirtual
6f50: 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  ,   /* True if t
6f60: 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41 4c  his is a VIRTUAL
6f70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6f80: 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20  noErr        /* 
6f90: 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61  Do nothing if ta
6fa0: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
6fb0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
6fc0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72   *pTable;.  char
6fd0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20   *zName = 0; /* 
6fe0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
6ff0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
7000: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
7010: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
7020: 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  *v;.  int iDb;  
7030: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
7040: 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65  se number to cre
7050: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
7060: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
7070: 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c  me;    /* Unqual
7080: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
7090: 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74  e table to creat
70a0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  e */..  if( db->
70b0: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d  init.busy && db-
70c0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31  >init.newTnum==1
70d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69   ){.    /* Speci
70e0: 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e  al case:  Parsin
70f0: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
7100: 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65  ter or sqlite_te
7110: 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61  mp_master schema
7120: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62   */.    iDb = db
7130: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
7140: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
7150: 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48 45  bStrDup(db, SCHE
7160: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
7170: 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d      pName = pNam
7180: 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e1;.  }else{.   
7190: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
71a0: 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d  ase */.    iDb =
71b0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
71c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
71d0: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
71e0: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
71f0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  <0 ) return;.   
7200: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
7210: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
7220: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
7230: 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=1 ){.      /*
7240: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
7250: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
7260: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
7270: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
7280: 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64   .      ** the d
7290: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
72a0: 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20  "temp" anyway.  
72b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
72c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
72d0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
72e0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
72f0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
7300: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7310: 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
7320: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
7330: 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20   ) iDb = 1;.    
7340: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
7350: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
7360: 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
7370: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
7380: 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
7390: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70  e3RenameTokenMap
73a0: 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29  (pParse, (void*)
73b0: 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20  zName, pName);. 
73c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73     }.  }.  pPars
73d0: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20  e->sNameToken = 
73e0: 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e  *pName;.  if( zN
73f0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
7400: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
7410: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
7420: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
7430: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
7440: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7450: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
7460: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
7470: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
7480: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7490: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
74a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 54 65 6d  .  assert( isTem
74b0: 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d  p==0 || isTemp==
74c0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
74d0: 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69  sView==0 || isVi
74e0: 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20  ew==1 );.  {.   
74f0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7500: 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20   aCode[] = {.   
7510: 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54      SQLITE_CREAT
7520: 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20  E_TABLE,.       
7530: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
7540: 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20 20  MP_TABLE,.      
7550: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
7560: 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51 4c 49  IEW,.       SQLI
7570: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
7580: 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63  IEW.    };.    c
7590: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
75a0: 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
75b0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
75c0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
75d0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
75e0: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
75f0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
7600: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
7610: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
7620: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
7630: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
7640: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
7650: 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65  arse, (int)aCode
7660: 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77  [isTemp+2*isView
7670: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c            zName,
76a0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
76b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
76c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
76d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
76e0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
76f0: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
7700: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
7710: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
7720: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
7730: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
7740: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
7750: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
7760: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
7770: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
7780: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
7790: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
77a0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
77b0: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
77c0: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
77d0: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
77e0: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
77f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
7800: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
7810: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
7820: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
7830: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
7840: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
7850: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
7860: 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53  !IN_SPECIAL_PARS
7870: 45 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  E ){.    char *z
7880: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
7890: 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
78a0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
78b0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
78c0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
78d0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
78e0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
78f0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c      pTable = sql
7900: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
7910: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20  , zName, zDb);. 
7920: 20 20 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b     if( pTable ){
7930: 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72  .      if( !noEr
7940: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
7950: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7960: 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61  rse, "table %T a
7970: 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c 20  lready exists", 
7980: 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  pName);.      }e
7990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
79a0: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
79b0: 75 73 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  usy || CORRUPT_D
79c0: 42 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  B );.        sql
79d0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
79e0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
79f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7a00: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7a10: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7a20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
7a30: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
7a40: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7a50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7a60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7a70: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
7a80: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
7a90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
7aa0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7ab0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7ac0: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
7ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
7ae0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
7af0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
7b00: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  le==0 ){.    ass
7b10: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
7b20: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 50 61  ailed );.    pPa
7b30: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7b40: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
7b50: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
7b60: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
7b70: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
7b80: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
7b90: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
7ba0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
7bb0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
7bc0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
7bd0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7be0: 6c 65 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  le->nTabRef = 1;
7bf0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7c00: 45 46 41 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20  EFAULT_ROWEST.  
7c10: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7c20: 73 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  st = sqlite3LogE
7c30: 73 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  st(SQLITE_DEFAUL
7c40: 54 5f 52 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65  T_ROWEST);.#else
7c50: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7c60: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7c70: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7c80: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
7c90: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
7ca0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
7cb0: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7cc0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7cd0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7ce0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7cf0: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7d00: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7d10: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7d20: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7d30: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7d40: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7d50: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7d60: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
7d70: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
7d80: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
7d90: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
7da0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7db0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7dc0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7dd0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7de0: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7df0: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7e10: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7e20: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7e30: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7e40: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7e50: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
7e60: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
7e70: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
7e80: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
7e90: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
7ea0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
7eb0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7ec0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7ed0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7ee0: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7ef0: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7f00: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7f10: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7f20: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
7f30: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
7f40: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
7f50: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
7f60: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
7f70: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
7f80: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
7f90: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
7fa0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
7fb0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
7fc0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
7fd0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7fe0: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7ff0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
8000: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
8010: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
8020: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
8030: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
8040: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
8050: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
8060: 20 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20      int addr1;. 
8070: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
8080: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
8090: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
80a0: 20 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73   /* nullRow[] is
80b0: 20 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e   an OP_Record en
80c0: 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20  coding of a row 
80d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c  containing 5 NUL
80e0: 4c 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  Ls */.    static
80f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c   const char null
8100: 52 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20  Row[] = { 6, 0, 
8110: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
8120: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
8130: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
8140: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
8150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8160: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8170: 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61      if( isVirtua
8180: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
8190: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
81a0: 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20  OP_VBegin);.    
81b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
81c0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   If the file for
81d0: 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  mat and encoding
81e0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
81f0: 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73   have not been s
8200: 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  et, .    ** set 
8210: 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f  them now..    */
8220: 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72  .    reg1 = pPar
8230: 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b  se->regRowid = +
8240: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
8250: 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65     reg2 = pParse
8260: 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50  ->regRoot = ++pP
8270: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
8280: 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d  reg3 = ++pParse-
8290: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
82a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
82b0: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
82c0: 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f  Db, reg3, BTREE_
82d0: 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20  FILE_FORMAT);.  
82e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
82f0: 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a  sBtree(v, iDb);.
8300: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
8310: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
8320: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56   OP_If, reg3); V
8330: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8340: 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d      fileFormat =
8350: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8360: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
8370: 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20  mt)!=0 ?.       
8380: 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53             1 : S
8390: 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46  QLITE_MAX_FILE_F
83a0: 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74  ORMAT;.    sqlit
83b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
83c0: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
83d0: 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  b, BTREE_FILE_FO
83e0: 52 4d 41 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74  RMAT, fileFormat
83f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8400: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
8410: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
8420: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
8430: 4e 47 2c 20 45 4e 43 28 64 62 29 29 3b 0a 20 20  NG, ENC(db));.  
8440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
8450: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
8460: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
8470: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
8480: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
8490: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
84a0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
84b0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
84c0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
84d0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
84e0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
84f0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
8500: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
8510: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
8520: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
8530: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
8540: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
8550: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
8560: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
8570: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
8580: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
8590: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
85a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
85b0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
85c0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
85d0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
85e0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
85f0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
8600: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
8610: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
8620: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
8630: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
8640: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
8650: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8660: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8670: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8680: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
8690: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
86a0: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
86b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
86c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
86d0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
86e0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
86f0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
8700: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
8710: 61 62 20 3d 0a 20 20 20 20 20 20 20 20 20 73 71  ab =.         sq
8720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8730: 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  v, OP_CreateBtre
8740: 65 2c 20 69 44 62 2c 20 72 65 67 32 2c 20 42 54  e, iDb, reg2, BT
8750: 52 45 45 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20  REE_INTKEY);.   
8760: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
8770: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
8780: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87a0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
87b0: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
87c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87d0: 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c  4(v, OP_Blob, 6,
87e0: 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f   reg3, 0, nullRo
87f0: 77 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  w, P4_STATIC);. 
8800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8810: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
8820: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
8830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8840: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
8850: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
8860: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8870: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
8880: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
8890: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
88a0: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
88b0: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
88c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
88d0: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
88e0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
88f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8900: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
8910: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74  eturn;.}../* Set
8920: 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20 61   properties of a
8930: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61   table column ba
8940: 73 65 64 20 6f 6e 20 74 68 65 20 28 6d 61 67 69  sed on the (magi
8950: 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20  cal).** name of 
8960: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23  the column..*/.#
8970: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8980: 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a  _HIDDEN_COLUMNS.
8990: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 75  void sqlite3Colu
89a0: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
89b0: 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70 54 61 62  Name(Table *pTab
89c0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
89d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
89e0: 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  trnicmp(pCol->zN
89f0: 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f  ame, "__hidden__
8a00: 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 10)==0 ){.   
8a10: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
8a20: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45  |= COLFLAG_HIDDE
8a30: 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  N;.  }else if( p
8a40: 54 61 62 20 26 26 20 70 43 6f 6c 21 3d 70 54 61  Tab && pCol!=pTa
8a50: 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c  b->aCol && (pCol
8a60: 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  [-1].colFlags & 
8a70: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 29 20  COLFLAG_HIDDEN) 
8a80: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  ){.    pTab->tab
8a90: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48  Flags |= TF_OOOH
8aa0: 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  idden;.  }.}.#en
8ab0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  dif.../*.** Add 
8ac0: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8ad0: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8ae0: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8af0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8b00: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8b10: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
8b20: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
8b30: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
8b40: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8b50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8b60: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8b70: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8b80: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8b90: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8bb0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8bc0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8bd0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8be0: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8bf0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8c00: 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b  , Token *pType){
8c10: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
8c20: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
8c30: 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  .  char *zType;.
8c40: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
8c50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8c60: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
8c70: 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  ( (p = pParse->p
8c80: 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72  NewTable)==0 ) r
8c90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
8ca0: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8cb0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8cc0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8cd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8ce0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8cf0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8d00: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8d10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d  eturn;.  }.  z =
8d20: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8d30: 52 61 77 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e  Raw(db, pName->n
8d40: 20 2b 20 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29   + pType->n + 2)
8d50: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8d60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f  eturn;.  if( IN_
8d70: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20  RENAME_OBJECT ) 
8d80: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
8d90: 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
8da0: 6f 69 64 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a  oid*)z, pName);.
8db0: 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d    memcpy(z, pNam
8dc0: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
8dd0: 0a 20 20 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d  .  z[pName->n] =
8de0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
8df0: 75 6f 74 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69  uote(z);.  for(i
8e00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
8e10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8e20: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20  ite3_stricmp(z, 
8e30: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  p->aCol[i].zName
8e40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
8e50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8e60: 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65  arse, "duplicate
8e70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73   column name: %s
8e80: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", z);.      sql
8e90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8ea0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8eb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8ec0: 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29   (p->nCol & 0x7)
8ed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d  ==0 ){.    Colum
8ee0: 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65  n *aNew;.    aNe
8ef0: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
8f00: 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c  lloc(db,p->aCol,
8f10: 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65  (p->nCol+8)*size
8f20: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
8f30: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
8f40: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8f50: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a  3DbFree(db, z);.
8f60: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8f70: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20    }.    p->aCol 
8f80: 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43  = aNew;.  }.  pC
8f90: 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d  ol = &p->aCol[p-
8fa0: 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74  >nCol];.  memset
8fb0: 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (pCol, 0, sizeof
8fc0: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8fd0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
8fe0: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
8ff0: 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e  nPropertiesFromN
9000: 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a  ame(p, pCol);. .
9010: 20 20 69 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d    if( pType->n==
9020: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
9030: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
9040: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
9050: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
9060: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 20  ult affinity.   
9070: 20 2a 2a 20 27 42 4c 4f 42 27 20 77 69 74 68 20   ** 'BLOB' with 
9080: 61 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  a default size o
9090: 66 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  f 4 bytes. */.  
90a0: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
90b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
90c0: 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a  OB;.    pCol->sz
90d0: 45 73 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  Est = 1;.#ifdef 
90e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f  SQLITE_ENABLE_SO
90f0: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a  RTER_REFERENCES.
9100: 20 20 20 20 69 66 28 20 34 3e 3d 73 71 6c 69 74      if( 4>=sqlit
9110: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
9120: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20  zSorterRef ){.  
9130: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
9140: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f  gs |= COLFLAG_SO
9150: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23  RTERREF;.    }.#
9160: 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
9170: 20 20 20 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73     zType = z + s
9180: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9190: 29 20 2b 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70  ) + 1;.    memcp
91a0: 79 28 7a 54 79 70 65 2c 20 70 54 79 70 65 2d 3e  y(zType, pType->
91b0: 7a 2c 20 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20  z, pType->n);.  
91c0: 20 20 7a 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e    zType[pType->n
91d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
91e0: 65 33 44 65 71 75 6f 74 65 28 7a 54 79 70 65 29  e3Dequote(zType)
91f0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
9200: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
9210: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
9220: 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f  , pCol);.    pCo
9230: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
9240: 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
9250: 20 20 7d 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b    }.  p->nCol++;
9260: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  .  pParse->const
9270: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
9280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9290: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
92a0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
92b0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
92c0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
92d0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
92e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
92f0: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
9300: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
9310: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
9320: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9330: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
9340: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
9350: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
9360: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9370: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
9380: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
9390: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
93a0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
93b0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
93c0: 20 2a 70 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50   *pCol;.  p = pP
93d0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
93e0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
93f0: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
9400: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
9410: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
9420: 43 6f 6c 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e  Col-1];.  pCol->
9430: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
9440: 45 72 72 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46  Error;.  p->tabF
9450: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f  lags |= TF_HasNo
9460: 74 4e 75 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74  tNull;..  /* Set
9470: 20 74 68 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c   the uniqNotNull
9480: 20 66 6c 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49   flag on any UNI
9490: 51 55 45 20 6f 72 20 50 4b 20 69 6e 64 65 78 65  QUE or PK indexe
94a0: 73 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  s already create
94b0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63  d.  ** on this c
94c0: 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  olumn.  */.  if(
94d0: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20   pCol->colFlags 
94e0: 26 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  & COLFLAG_UNIQUE
94f0: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
9500: 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
9510: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9520: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9530: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9540: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
9550: 6c 3d 3d 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e  l==1 && pIdx->on
9560: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
9580: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70  ->aiColumn[0]==p
9590: 2d 3e 6e 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ->nCol-1 ){.    
95a0: 20 20 20 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f      pIdx->uniqNo
95b0: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20  tNull = 1;.     
95c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
95d0: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
95e0: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
95f0: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
9600: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
9610: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
9620: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
9630: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9640: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
9650: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
9660: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
9670: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
9680: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
9690: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
96a0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
96b0: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
96c0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
96d0: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
96e0: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
96f0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
9700: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
9710: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
9720: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
9730: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
9740: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
9750: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
9760: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
9770: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
9780: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9790: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
97a0: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
97b0: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
97c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97e0: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
97f0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
9800: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
9810: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
9820: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
9830: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
9840: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
9850: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
9860: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
9870: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
9880: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   | SQLITE_AFF_BL
9890: 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  OB.** 'REAL'    
98a0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
98b0: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
98c0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
98d0: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
98e0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
98f0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
9900: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
9910: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
9920: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
9930: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
9940: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9950: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9960: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
9970: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63  nityType(const c
9980: 68 61 72 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e  har *zIn, Column
9990: 20 2a 70 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68   *pCol){.  u32 h
99a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
99b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
99c0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
99d0: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
99e0: 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 21 3d  .  assert( zIn!=
99f0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  0 );.  while( zI
9a00: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9a10: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9a20: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9a30: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9a40: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9a50: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9a60: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9a70: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9a80: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9a90: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9aa0: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
9ab0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
9ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
9ad0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
9ae0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
9af0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
9b00: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9b10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9b20: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9b30: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9b40: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9b50: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9b60: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9b70: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9b80: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9b90: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9ba0: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
9bb0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
9bc0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
9bd0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
9be0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9bf0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
9c00: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9c10: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9c20: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
9c30: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9c40: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9c50: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9c60: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9c70: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9c80: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9c90: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9ca0: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
9cb0: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
9cc0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
9cd0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
9ce0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
9cf0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
9d00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9d10: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9d20: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9d30: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9d40: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9d50: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9d60: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9d70: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9d80: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9d90: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9da0: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
9db0: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
9dd0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9de0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9df0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
9e00: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9e10: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9e20: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9e30: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9e40: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9e50: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9e60: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9e70: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9e80: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9ea0: 20 49 66 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20   If pCol is not 
9eb0: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9ec0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9ed0: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9ee0: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9ef0: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9f00: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
9f10: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
9f20: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
9f30: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 20 20 20     int v = 0;   
9f40: 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20  /* default size 
9f50: 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74 65  is approx 4 byte
9f60: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66  s */.    if( aff
9f70: 3c 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  <SQLITE_AFF_NUME
9f80: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 69 66 28  RIC ){.      if(
9f90: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9fa0: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
9fb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
9fc0: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
9fd0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c             /* BL
9ff0: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
a000: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
a010: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
a020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65         sqlite3Ge
a030: 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76  tInt32(zChar, &v
a040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
a050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
a060: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61  }.          zCha
a070: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
a080: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a090: 20 20 20 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a      v = 16;   /*
a0a0: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
a0b0: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
a0c0: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
a0d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
a0e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
a0f0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
a100: 45 53 0a 20 20 20 20 69 66 28 20 76 3e 3d 73 71  ES.    if( v>=sq
a110: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a120: 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20 29 7b  g.szSorterRef ){
a130: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  .      pCol->col
a140: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a150: 5f 53 4f 52 54 45 52 52 45 46 3b 0a 20 20 20 20  _SORTERREF;.    
a160: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 20 3d  }.#endif.    v =
a170: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 69 66   v/4 + 1;.    if
a180: 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35  ( v>255 ) v = 25
a190: 35 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45  5;.    pCol->szE
a1a0: 73 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  st = v;.  }.  re
a1b0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
a1c0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
a1d0: 6e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  n is the default
a1e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d   value for the m
a1f0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a200: 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20  ed column.** of 
a210: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
a220: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
a230: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65  uction..**.** De
a240: 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72  fault value expr
a250: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  essions must be 
a260: 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65  constant.  Raise
a270: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
a280: 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20   this.** is not 
a290: 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  the case..**.** 
a2a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a2b0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
a2c0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
a2d0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
a2e0: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
a2f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
a300: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a310: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
a320: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a330: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
a340: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a350: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a370: 54 68 65 20 70 61 72 73 65 64 20 65 78 70 72 65  The parsed expre
a380: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 66  ssion of the def
a390: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ault value */.  
a3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61  const char *zSta
a3b0: 72 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 72  rt,      /* Star
a3c0: 74 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  t of the default
a3d0: 20 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20   value text */. 
a3e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
a3f0: 64 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  d         /* Fir
a400: 73 74 20 63 68 61 72 61 63 74 65 72 20 70 61 73  st character pas
a410: 74 20 65 6e 64 20 6f 66 20 64 65 66 61 75 74 20  t end of defaut 
a420: 76 61 6c 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b  value text */.){
a430: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43  .  Table *p;.  C
a440: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
a450: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
a460: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70  rse->db;.  p = p
a470: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
a480: 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a  ;.  if( p!=0 ){.
a490: 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e      pCol = &(p->
a4a0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29  aCol[p->nCol-1])
a4b0: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
a4c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a4d0: 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78 70 72  OrFunction(pExpr
a4e0: 2c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29  , db->init.busy)
a4f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a500: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a510: 2c 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65  , "default value
a520: 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20   of column [%s] 
a530: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22  is not constant"
a540: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  ,.          pCol
a550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
a560: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
a570: 63 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73  copy of pExpr is
a580: 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
a590: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61   the original, a
a5a0: 73 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73  s pExpr contains
a5b0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73  .      ** tokens
a5c0: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76   that point to v
a5d0: 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a  olatile memory..
a5e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45        */.      E
a5f0: 78 70 72 20 78 3b 0a 20 20 20 20 20 20 73 71 6c  xpr x;.      sql
a600: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a610: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
a620: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 78  .      memset(&x
a630: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
a640: 0a 20 20 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b  .      x.op = TK
a650: 5f 53 50 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75  _SPAN;.      x.u
a660: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
a670: 33 44 62 53 70 61 6e 44 75 70 28 64 62 2c 20 7a  3DbSpanDup(db, z
a680: 53 74 61 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20  Start, zEnd);.  
a690: 20 20 20 20 78 2e 70 4c 65 66 74 20 3d 20 70 45      x.pLeft = pE
a6a0: 78 70 72 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61  xpr;.      x.fla
a6b0: 67 73 20 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20  gs = EP_Skip;.  
a6c0: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
a6d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a6e0: 28 64 62 2c 20 26 78 2c 20 45 58 50 52 44 55 50  (db, &x, EXPRDUP
a6f0: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
a700: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a710: 2c 20 78 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  , x.u.zToken);. 
a720: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 49     }.  }.  if( I
a730: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
a740: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
a750: 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28 70 50  nameExprUnmap(pP
a760: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
a770: 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
a780: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
a790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77  ;.}../*.** Backw
a7a0: 61 72 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69  ards Compatibili
a7b0: 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20  ty Hack:.** .** 
a7c0: 48 69 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69  Historical versi
a7d0: 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63  ons of SQLite ac
a7e0: 63 65 70 74 65 64 20 73 74 72 69 6e 67 73 20 61  cepted strings a
a7f0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  s column names i
a800: 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64  n.** indexes and
a810: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
a820: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20  straints and in 
a830: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
a840: 74 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  ts.  Example:.**
a850: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
a860: 41 42 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64  ABLE xyz(a,b,c,d
a870: 2c 65 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27  ,e,PRIMARY KEY('
a880: 61 27 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27  a'),UNIQUE('b','
a890: 63 27 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29  c' COLLATE trim)
a8a0: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 49  .**     CREATE I
a8b0: 4e 44 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28  NDEX abc ON xyz(
a8c0: 27 63 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27  'c','d' DESC,'e'
a8d0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
a8e0: 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  DESC);.**.** Thi
a8f0: 73 20 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74  s is goofy.  But
a900: 20 74 6f 20 70 72 65 73 65 72 76 65 20 62 61 63   to preserve bac
a910: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
a920: 6c 69 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65  lity we continue
a930: 20 74 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74   to.** accept it
a940: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a950: 64 6f 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  does the necessa
a960: 72 79 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20  ry conversion.  
a970: 49 74 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74  It converts.** t
a980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69  he expression gi
a990: 76 65 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d  ven in its argum
a9a0: 65 6e 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54  ent from a TK_ST
a9b0: 52 49 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49  RING into a TK_I
a9c0: 44 0a 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72  D.** if the expr
a9d0: 65 73 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61  ession is just a
a9e0: 20 54 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20   TK_STRING with 
a9f0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c  an optional COLL
aa00: 41 54 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49  ATE clause..** I
aa10: 66 20 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e  f the epxression
aa20: 20 69 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   is anything oth
aa30: 65 72 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e  er than TK_STRIN
aa40: 47 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  G, the expressio
aa50: 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  n is.** unchange
aa60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
aa70: 64 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54  d sqlite3StringT
aa80: 6f 49 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oId(Expr *p){.  
aa90: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54  if( p->op==TK_ST
aaa0: 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f  RING ){.    p->o
aab0: 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c  p = TK_ID;.  }el
aac0: 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  se if( p->op==TK
aad0: 5f 43 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70  _COLLATE && p->p
aae0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52  Left->op==TK_STR
aaf0: 49 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c  ING ){.    p->pL
ab00: 65 66 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b  eft->op = TK_ID;
ab10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
ab20: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
ab30: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
ab40: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
ab50: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
ab60: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
ab70: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
ab80: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
ab90: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
aba0: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
abb0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
abc0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
abd0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
abe0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
abf0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
ac00: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
ac10: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
ac20: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
ac30: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
ac40: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
ac50: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
ac60: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
ac70: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
ac80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
ac90: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
aca0: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
acb0: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
acc0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
acd0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
ace0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
acf0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
ad00: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
ad10: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
ad20: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
ad30: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
ad40: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
ad50: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
ad60: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
ad70: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
ad80: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
ad90: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
ada0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
adb0: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
adc0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
add0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
ade0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
adf0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
ae00: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
ae10: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
ae20: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
ae30: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
ae40: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
ae50: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
ae60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
ae70: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ae80: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
ae90: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
aea0: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
aeb0: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
aec0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
aed0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
aee0: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
aef0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
af00: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
af10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
af20: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
af30: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
af40: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
af50: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
af60: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
af70: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
af80: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
af90: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
afa0: 77 54 61 62 6c 65 3b 0a 20 20 43 6f 6c 75 6d 6e  wTable;.  Column
afb0: 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
afc0: 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a  t iCol = -1, i;.
afd0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69    int nTerm;.  i
afe0: 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
aff0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
b000: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
b010: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
b020: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
b030: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b040: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
b050: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
b060: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
b070: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
b080: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
b090: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
b0a0: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
b0b0: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
b0c0: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
b0d0: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
b0e0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
b0f0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
b100: 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
b110: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
b120: 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73    pCol->colFlags
b130: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
b140: 4b 45 59 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  KEY;.    nTerm =
b150: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
b160: 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e   nTerm = pList->
b170: 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69  nExpr;.    for(i
b180: 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
b190: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b1a0: 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  CExpr = sqlite3E
b1b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
b1c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b1d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b1e0: 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20 20   pCExpr!=0 );.  
b1f0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e      sqlite3Strin
b200: 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a 20  gToId(pCExpr);. 
b210: 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d       if( pCExpr-
b220: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
b230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
b240: 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78 70   *zCName = pCExp
b250: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
b260: 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b       for(iCol=0;
b270: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b280: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
b290: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b2a0: 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c 20  StrICmp(zCName, 
b2b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
b2c0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
b2d0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
b2e0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
b2f0: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l];.            
b300: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
b310: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
b320: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  Y;.            b
b330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b340: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b350: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b360: 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20  if( nTerm==1.   
b370: 26 26 20 70 43 6f 6c 0a 20 20 20 26 26 20 73 71  && pCol.   && sq
b380: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 73 71 6c  lite3StrICmp(sql
b390: 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
b3a0: 43 6f 6c 2c 22 22 29 2c 20 22 49 4e 54 45 47 45  Col,""), "INTEGE
b3b0: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
b3c0: 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45 5f 53  tOrder!=SQLITE_S
b3d0: 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20 20 20  O_DESC.  ){.    
b3e0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
b3f0: 4a 45 43 54 20 26 26 20 70 4c 69 73 74 20 29 7b  JECT && pList ){
b400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b410: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
b420: 50 61 72 73 65 2c 20 26 70 54 61 62 2d 3e 69 50  Parse, &pTab->iP
b430: 4b 65 79 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Key, pList->a[0]
b440: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  .pExpr);.    }. 
b450: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
b460: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
b470: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
b480: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
b490: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
b4a0: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
b4b0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
b4c0: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
b4d0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
b4e0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
b4f0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
b500: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
b510: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  0].sortOrder;.  
b520: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
b530: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
b540: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
b550: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
b560: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
b570: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
b580: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
b590: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
b5a0: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
b5b0: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
b5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b5d0: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
b5e0: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
b5f0: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
b600: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b620: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
b630: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
b640: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
b650: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
b660: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b670: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
b680: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b690: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
b6a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b6b0: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
b6c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
b6d0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
b6e0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
b6f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
b700: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
b710: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
b720: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b730: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b740: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
b750: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
b760: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
b770: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b780: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b790: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b7a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b7b0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b7c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b7d0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
b7e0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
b7f0: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b800: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b810: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b820: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b830: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b840: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b850: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b860: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b870: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b880: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b890: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b8a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b8b0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b8c0: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b8d0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b8e0: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b8f0: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b900: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b910: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
b920: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
b930: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b940: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
b950: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
b960: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b970: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
b980: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
b990: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
b9a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b9b0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
b9c0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
b9d0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
b9e0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
b9f0: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ba10: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
ba20: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ba30: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
ba40: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
ba50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ba60: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
ba70: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
ba80: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
ba90: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
baa0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
bab0: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
bac0: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
bad0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
bae0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
baf0: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
bb00: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
bb10: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
bb20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
bb30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
bb40: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
bb50: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
bb60: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
bb70: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
bb80: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
bb90: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
bba0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
bbb0: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
bbc0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
bbd0: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
bbe0: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
bbf0: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
bc00: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
bc10: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
bc20: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
bc30: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
bc40: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
bc50: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
bc60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
bc70: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
bc80: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
bc90: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
bca0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
bcb0: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
bcc0: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
bcd0: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
bce0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bcf0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bd00: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
bd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
bd20: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
bd30: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
bd40: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
bd50: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
bd60: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
bd70: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
bd80: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
bd90: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
bda0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
bdb0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
bdc0: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
bdd0: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
bde0: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
bdf0: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
be00: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
be10: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
be20: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
be30: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
be40: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
be50: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
be60: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
be70: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
be80: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
be90: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
bea0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
beb0: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
bec0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
bed0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
bee0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
bef0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
bf00: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
bf10: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
bf20: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
bf30: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
bf40: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
bf50: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bf60: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
bf70: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
bf80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
bf90: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
bfa0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bfb0: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
bfc0: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
bfd0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bfe0: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
bff0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
c000: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
c010: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
c020: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
c030: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
c040: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c050: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
c060: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
c070: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
c080: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
c090: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
c0a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
c0b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c0c0: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
c0d0: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
c0e0: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
c0f0: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
c100: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
c110: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
c120: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
c130: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
c140: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
c150: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
c160: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
c170: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
c180: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
c190: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
c1a0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
c1b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
c1c0: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
c1d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
c1e0: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
c1f0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
c200: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
c210: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
c220: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c230: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
c240: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
c250: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
c260: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
c270: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
c280: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
c290: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
c2a0: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
c2b0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
c2c0: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
c2d0: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
c2e0: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
c2f0: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
c300: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
c310: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
c320: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
c330: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
c340: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
c350: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
c360: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
c370: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
c380: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
c390: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
c3a0: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
c3b0: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
c3c0: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
c3d0: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
c3e0: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
c3f0: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
c400: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
c410: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
c420: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
c430: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
c440: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
c450: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
c460: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
c470: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
c480: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
c490: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c  ough..**.** IMPL
c4a0: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
c4b0: 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53 51 4c  -34230-56049 SQL
c4c0: 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ite automaticall
c4d0: 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a 2a 20  y increments.** 
c4e0: 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72 73 69  the schema-versi
c4f0: 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  on whenever the 
c500: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 2e 0a  schema changes..
c510: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
c520: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
c530: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
c540: 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
c550: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c560: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
c570: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
c580: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
c590: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
c5a0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71   iDb, 0) );.  sq
c5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c5c0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
c5d0: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
c5e0: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20 20 20  MA_VERSION, .   
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67 6e 65  (int)(1+(unsigne
c610: 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  d)db->aDb[iDb].p
c620: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
c630: 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ookie));.}../*.*
c640: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
c650: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
c660: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
c670: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
c680: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
c690: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
c6a0: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
c6b0: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
c6c0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
c6d0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
c6e0: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
c6f0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
c700: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
c710: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
c720: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
c730: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
c740: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
c750: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
c760: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
c770: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
c780: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
c790: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
c7a0: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
c7b0: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
c7c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
c7d0: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
c7e0: 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74  ter to an output
c7f0: 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63   buffer. The sec
c800: 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ond .** paramete
c810: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
c820: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  o an integer tha
c830: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f  t contains the o
c840: 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63  ffset at.** whic
c850: 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  h to write into 
c860: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
c870: 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
c880: 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e   copies the.** n
c890: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
c8a0: 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20  ring pointed to 
c8b0: 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72  by the third par
c8c0: 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49  ameter, zSignedI
c8d0: 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20  dent,.** to the 
c8e0: 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74  specified offset
c8f0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61   in the buffer a
c900: 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78  nd updates *pIdx
c910: 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20   to refer.** to 
c920: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61  the first byte a
c930: 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79  fter the last by
c940: 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  te written befor
c950: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
c960: 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e  .** If the strin
c970: 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63  g zSignedIdent c
c980: 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
c990: 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69   of alpha-numeri
c9a0: 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c  c.** characters,
c9b0: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
c9c0: 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64  with a digit and
c9d0: 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b   is not an SQL k
c9e0: 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20  eyword,.** then 
c9f0: 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
ca00: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
ca10: 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20  r exactly as it 
ca20: 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  is. Otherwise,.*
ca30: 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75  * it is quoted u
ca40: 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74  sing double-quot
ca50: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
ca60: 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72  id identPut(char
ca70: 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20   *z, int *pIdx, 
ca80: 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65  char *zSignedIde
ca90: 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  nt){.  unsigned 
caa0: 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28  char *zIdent = (
cab0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
cac0: 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69  SignedIdent;.  i
cad0: 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f  nt i, j, needQuo
cae0: 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b  te;.  i = *pIdx;
caf0: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ..  for(j=0; zId
cb00: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
cb10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73    if( !sqlite3Is
cb20: 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29  alnum(zIdent[j])
cb30: 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27   && zIdent[j]!='
cb40: 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  _' ) break;.  }.
cb50: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71    needQuote = sq
cb60: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64  lite3Isdigit(zId
cb70: 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20  ent[0]).        
cb80: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65      || sqlite3Ke
cb90: 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74  ywordCode(zIdent
cba0: 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20  , j)!=TK_ID.    
cbb0: 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e          || zIden
cbc0: 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20  t[j]!=0.        
cbd0: 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20      || j==0;..  
cbe0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
cbf0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
cc00: 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b  for(j=0; zIdent[
cc10: 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b  j]; j++){.    z[
cc20: 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d  i++] = zIdent[j]
cc30: 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74  ;.    if( zIdent
cc40: 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b  [j]=='"' ) z[i++
cc50: 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69  ] = '"';.  }.  i
cc60: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
cc70: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a  [i++] = '"';.  z
cc80: 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78  [i] = 0;.  *pIdx
cc90: 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = i;.}../*.** G
cca0: 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45  enerate a CREATE
ccb0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
ccc0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
ccd0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61   the given.** ta
cce0: 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20  ble.  Memory to 
ccf0: 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66  hold the text of
cd00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
cd10: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
cd20: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
cd30: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
cd40: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
cd50: 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ng function..*/.
cd60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65  static char *cre
cd70: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c  ateTableStmt(sql
cd80: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
cd90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  *p){.  int i, k,
cda0: 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d   n;.  char *zStm
cdb0: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c  t;.  char *zSep,
cdc0: 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a   *zSep2, *zEnd;.
cdd0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
cde0: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
cdf0: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
ce00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
ce10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
ce20: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
ce30: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b  h(pCol->zName) +
ce40: 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69   5;.  }.  n += i
ce50: 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e  dentLength(p->zN
ce60: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30  ame);.  if( n<50
ce70: 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20   ){ .    zSep = 
ce80: 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20  "";.    zSep2 = 
ce90: 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ",";.    zEnd = 
cea0: 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ")";.  }else{.  
ceb0: 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b    zSep = "\n  ";
cec0: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c  .    zSep2 = ",\
ced0: 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  n  ";.    zEnd =
cee0: 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20   "\n)";.  }.  n 
cef0: 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f  += 35 + 6*p->nCo
cf00: 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c  l;.  zStmt = sql
cf10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
cf20: 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74  0, n);.  if( zSt
cf30: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
cf40: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
cf50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
cf60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
cf70: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
cf80: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
cf90: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
cfa0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
cfb0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
cfc0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
cfd0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
cfe0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
cff0: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
d000: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
d010: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
d020: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
d030: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
d040: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
d050: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
d060: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
d070: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
d080: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
d090: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
d0a0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
d0b0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
d0c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
d0d0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
d0e0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
d0f0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
d100: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
d110: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
d120: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d130: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
d140: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
d150: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
d160: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
d170: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
d180: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
d190: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
d1a0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
d1b0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
d1c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
d1d0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
d1e0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
d1f0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
d200: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
d210: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
d220: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
d230: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
d240: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
d250: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
d260: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
d270: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
d280: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
d290: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
d2a0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
d2b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
d2c0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
d2d0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
d2e0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d2f0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
d300: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
d310: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
d320: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
d330: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
d340: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
d350: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
d360: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
d370: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
d380: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
d390: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
d3a0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
d3b0: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
d3c0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
d3d0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
d3e0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
d3f0: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
d400: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
d410: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
d420: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
d430: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
d440: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
d450: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
d460: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
d470: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
d480: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
d490: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
d4a0: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
d4b0: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
d4c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
d4d0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
d4e0: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
d4f0: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
d500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
d510: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
d520: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
d530: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
d540: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
d550: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
d560: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
d570: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
d580: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
d590: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
d5a0: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
d5b0: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
d5c0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
d5d0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
d5e0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
d5f0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d600: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
d610: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
d620: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
d630: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
d640: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
d650: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
d660: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d670: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
d680: 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74  onst char**)zExt
d690: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
d6a0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b  sizeof(char*)*N;
d6b0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
d6c0: 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  , pIdx->aiColumn
d6d0: 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49  , sizeof(i16)*pI
d6e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
d6f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  pIdx->aiColumn =
d700: 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20   (i16*)zExtra;. 
d710: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
d720: 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63  f(i16)*N;.  memc
d730: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
d740: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64  >aSortOrder, pId
d750: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
d760: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  Idx->aSortOrder 
d770: 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20  = (u8*)zExtra;. 
d780: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d   pIdx->nColumn =
d790: 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65   N;.  pIdx->isRe
d7a0: 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74  sized = 1;.  ret
d7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d7c0: 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  ../*.** Estimate
d7d0: 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77   the total row w
d7e0: 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65  idth for a table
d7f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d800: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
d810: 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dth(Table *pTab)
d820: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61  {.  unsigned wTa
d830: 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ble = 0;.  const
d840: 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
d850: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
d860: 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  (i=pTab->nCol, p
d870: 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
d880: 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61  l; i>0; i--, pTa
d890: 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61  bCol++){.    wTa
d8a0: 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e  ble += pTabCol->
d8b0: 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  szEst;.  }.  if(
d8c0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29   pTab->iPKey<0 )
d8d0: 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61   wTable++;.  pTa
d8e0: 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71  b->szTabRow = sq
d8f0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62  lite3LogEst(wTab
d900: 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  le*4);.}../*.** 
d910: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
d920: 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72  rage size of a r
d930: 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  ow for an index.
d940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d950: 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
d960: 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  th(Index *pIdx){
d970: 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64  .  unsigned wInd
d980: 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ex = 0;.  int i;
d990: 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
d9a0: 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54  *aCol = pIdx->pT
d9b0: 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f  able->aCol;.  fo
d9c0: 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e  r(i=0; i<pIdx->n
d9d0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
d9e0: 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e    i16 x = pIdx->
d9f0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
da00: 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d   assert( x<pIdx-
da10: 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b  >pTable->nCol );
da20: 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78  .    wIndex += x
da30: 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49  <0 ? 1 : aCol[pI
da40: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  dx->aiColumn[i]]
da50: 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49  .szEst;.  }.  pI
da60: 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73  dx->szIdxRow = s
da70: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e  qlite3LogEst(wIn
da80: 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  dex*4);.}../* Re
da90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c  turn true if val
daa0: 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e  ue x is found an
dab0: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
dac0: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
dad0: 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63  iCol[].*/.static
dae0: 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63   int hasColumn(c
daf0: 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c  onst i16 *aiCol,
db00: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78   int nCol, int x
db10: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c  ){.  while( nCol
db20: 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d  -- > 0 ) if( x==
db30: 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74  *(aiCol++) ) ret
db40: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
db50: 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75  0;.}../* Recompu
db60: 74 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78  te the colNotIdx
db70: 65 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ed field of the 
db80: 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c  Index..**.** col
db90: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69  NotIdxed is a bi
dba0: 74 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61  tmask that has a
dbb0: 20 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74   0 bit represent
dbc0: 69 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64  ing each indexed
dbd0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  .** columns that
dbe0: 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
dbf0: 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
dc00: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
dc10: 54 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65  The.** high-orde
dc20: 72 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49  r bit of colNotI
dc30: 64 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31  dxed is always 1
dc40: 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64  .  All unindexed
dc50: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
dc60: 68 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20  he table have a 
dc70: 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  1..**.** The col
dc80: 4e 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73  NotIdxed mask is
dc90: 20 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65   AND-ed with the
dca0: 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c   SrcList.a[].col
dcb0: 55 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20  Used mask.** to 
dcc0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
dcd0: 20 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69   index is coveri
dce0: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ng index..*/.sta
dcf0: 74 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75  tic void recompu
dd00: 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65  teColumnsNotInde
dd10: 78 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29  xed(Index *pIdx)
dd20: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20  {.  Bitmask m = 
dd30: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
dd40: 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(j=pIdx->nColum
dd50: 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b  n-1; j>=0; j--){
dd60: 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64  .    int x = pId
dd70: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
dd80: 20 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a      if( x>=0 ){.
dd90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dda0: 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  x==BMS-1 );.    
ddb0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42    testcase( x==B
ddc0: 4d 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66  MS-2 );.      if
ddd0: 28 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d  ( x<BMS-1 ) m |=
dde0: 20 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20   MASKBIT(x);.   
ddf0: 20 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63   }.  }.  pIdx->c
de00: 6f 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b  olNotIdxed = ~m;
de10: 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
de20: 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36  ->colNotIdxed>>6
de30: 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  3)==1 );.}../*.*
de40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
de50: 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  uns at the end o
de60: 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  f parsing a CREA
de70: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
de80: 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61  nt that.** has a
de90: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63   WITHOUT ROWID c
dea0: 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20  lause.  The job 
deb0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
dec0: 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f  is to convert bo
ded0: 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73  th.** internal s
dee0: 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63  chema data struc
def0: 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65  tures and the ge
df00: 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64  nerated VDBE cod
df10: 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a  e so that they.*
df20: 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  * are appropriat
df30: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
df40: 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74  ROWID table inst
df50: 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74  ead of a rowid t
df60: 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73  able..** Changes
df70: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
df80: 20 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c      (1)  Set all
df90: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
dfa0: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65  PRIMARY KEY sche
dfb0: 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  ma object to be 
dfc0: 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20  NOT NULL..**    
dfd0: 20 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33   (2)  Convert P3
dfe0: 20 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68   parameter of th
dff0: 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65  e OP_CreateBtree
e000: 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b   from BTREE_INTK
e010: 45 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  EY .**          
e020: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b  into BTREE_BLOBK
e030: 45 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  EY..**     (3)  
e040: 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74  Bypass the creat
e050: 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ion of the sqlit
e060: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65  e_master table e
e070: 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntry.**         
e080: 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59   for the PRIMARY
e090: 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d   KEY as the prim
e0a0: 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73  ary key index is
e0b0: 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20   now.**         
e0c0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
e0d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e0e0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20   table entry of 
e0f0: 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66  the table itself
e100: 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65  ..**     (4)  Se
e110: 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d  t the Index.tnum
e120: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e130: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
e140: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
e150: 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68      schema to th
e160: 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20  e rootpage from 
e170: 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
e180: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
e190: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e1a0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e1b0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
e1c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
e1d0: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
e1e0: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
e1f0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
e200: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
e210: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
e220: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
e230: 6e 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72  nAllField and ar
e240: 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a  e not used for.*
e250: 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69  *          sorti
e260: 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20  ng or lookup or 
e270: 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b  uniqueness check
e280: 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52  s..**     (6)  R
e290: 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64  eplace the rowid
e2a0: 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74   tail on all aut
e2b0: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
e2c0: 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20  ated UNIQUE.**  
e2d0: 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20          indices 
e2e0: 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59  with the PRIMARY
e2f0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a   KEY columns..**
e300: 0a 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20  .** For virtual 
e310: 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29  tables, only (1)
e320: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
e330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
e340: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e350: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
e360: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
e370: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
e380: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
e390: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
e3a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
e3b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e3c0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
e3d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
e3e0: 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72  ..  /* Mark ever
e3f0: 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  y PRIMARY KEY co
e400: 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c  lumn as NOT NULL
e410: 20 28 65 78 63 65 70 74 20 66 6f 72 20 69 6d 70   (except for imp
e420: 6f 73 74 65 72 20 74 61 62 6c 65 73 29 0a 20 20  oster tables).  
e430: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
e440: 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
e450: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e460: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
e470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
e480: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f  pTab->aCol[i].co
e490: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
e4a0: 5f 50 52 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a  _PRIMKEY)!=0 ){.
e4b0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
e4c0: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
e4d0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  OE_Abort;.      
e4e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
e4f0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 50 33  * Convert the P3
e500: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
e510: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20 6f  OP_CreateBtree o
e520: 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 52 45 45  pcode from BTREE
e530: 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74  _INTKEY.  ** int
e540: 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e  o BTREE_BLOBKEY.
e550: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
e560: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b  se->addrCrTab ){
e570: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
e580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e590: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 70 50 61  eChangeP3(v, pPa
e5a0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20  rse->addrCrTab, 
e5b0: 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a  BTREE_BLOBKEY);.
e5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
e5d0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e5e0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
e5f0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
e600: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
e610: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
e620: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
e630: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
e640: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
e650: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
e660: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
e670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
e680: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
e690: 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  en;.    sqlite3T
e6a0: 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b  okenInit(&ipkTok
e6b0: 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  en, pTab->aCol[p
e6c0: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
e6d0: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  e);.    pList = 
e6e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
e6f0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
e700: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e710: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
e720: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20  lloc(db, TK_ID, 
e730: 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  &ipkToken, 0));.
e740: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e750: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
e760: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
e770: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
e780: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
e790: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
e7a0: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
e7b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
e7c0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
e7d0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
e7e0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
e7f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54       SQLITE_IDXT
e820: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b  YPE_PRIMARYKEY);
e830: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
e840: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
e850: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
e860: 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71  rn;.    pPk = sq
e870: 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
e880: 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
e890: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
e8a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e8b0: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
e8c0: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
e8d0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
e8e0: 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 64  * Remove all red
e8f0: 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 20 66  undant columns f
e900: 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52 59 20  rom the PRIMARY 
e910: 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  KEY.  For exampl
e920: 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  e, change.    **
e930: 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c   "PRIMARY KEY(a,
e940: 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29 22 20  b,a,b,c,b,c,d)" 
e950: 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49 4d 41  into just "PRIMA
e960: 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64 29 22  RY KEY(a,b,c,d)"
e970: 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a 2a 20  .  Later.    ** 
e980: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 65  code assumes the
e990: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
e9a0: 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61 74 65  tains no repeate
e9b0: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a  d columns..    *
e9c0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31 3b  /.    for(i=j=1;
e9d0: 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   i<pPk->nKeyCol;
e9e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e9f0: 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e   hasColumn(pPk->
ea00: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70 50 6b  aiColumn, j, pPk
ea10: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29  ->aiColumn[i]) )
ea20: 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 6e  {.        pPk->n
ea30: 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20 20 20  Column--;.      
ea40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
ea50: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 2b 2b  Pk->aiColumn[j++
ea60: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
ea70: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n[i];.      }.  
ea80: 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e 4b 65    }.    pPk->nKe
ea90: 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a 20 20  yCol = j;.  }.  
eaa0: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
eab0: 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  ;.  pPk->isCover
eac0: 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  ing = 1;.  if( !
ead0: 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65  db->init.imposte
eae0: 72 54 61 62 6c 65 20 29 20 70 50 6b 2d 3e 75 6e  rTable ) pPk->un
eaf0: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
eb00: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
eb10: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 70 61 73  Col;..  /* Bypas
eb20: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
eb30: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
eb40: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
eb50: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
eb60: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
eb70: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
eb80: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
eb90: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
eba0: 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 66 6f 72  BE.  ** code for
ebb0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ebc0: 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73 69 6e  (not when parsin
ebd0: 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66  g one as part of
ebe0: 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 20   reading.  ** a 
ebf0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 29  database schema)
ec00: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
ec10: 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 29 7b 0a   pPk->tnum>0 ){.
ec20: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
ec30: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
ec40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ec50: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
ec60: 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74  Pk->tnum, OP_Got
ec70: 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  o);.  }..  /* Th
ec80: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
ec90: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
eca0: 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  s the table root
ecb0: 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e   page */.  pPk->
ecc0: 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75  tnum = pTab->tnu
ecd0: 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  m;..  /* Update 
ece0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
ecf0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ed00: 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63  all UNIQUE indic
ed10: 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  es by converting
ed20: 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20  .  ** the final 
ed30: 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74  rowid column int
ed40: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f  o one or more co
ed50: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49  lumns of the PRI
ed60: 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20  MARY KEY..  */. 
ed70: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
ed80: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
ed90: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
eda0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
edb0: 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79  if( IsPrimaryKey
edc0: 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f  Index(pIdx) ) co
edd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
ede0: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
edf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ee00: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ee10: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ee20: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ee30: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
ee40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ee50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
ee60: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
ee70: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
ee80: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
ee90: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
eea0: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
eeb0: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
eec0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
eed0: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
eee0: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
eef0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
ef00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
ef10: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
ef20: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
ef30: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
ef40: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
ef50: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
ef60: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
ef70: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
ef80: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
ef90: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
efa0: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
efb0: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
efc0: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
efd0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
efe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eff0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
f000: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
f010: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
f020: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
f030: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
f040: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
f050: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
f060: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
f070: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
f080: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
f090: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
f0a0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
f0b0: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
f0c0: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
f0d0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
f0e0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
f0f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
f100: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
f110: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
f120: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f130: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
f140: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
f150: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
f160: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
f170: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74  zColl[j] = sqlit
f180: 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20  e3StrBINARY;.   
f190: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
f1a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
f1b0: 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  rt( pPk->nColumn
f1c0: 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==j );.    asser
f1d0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a  t( pTab->nCol==j
f1e0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
f1f0: 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20   pPk->nColumn = 
f200: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a  pTab->nCol;.  }.
f210: 20 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d    recomputeColum
f220: 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 50 6b  nsNotIndexed(pPk
f230: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
f240: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f250: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 52 65 74  LTABLE./*.** Ret
f260: 75 72 6e 20 74 72 75 65 20 69 66 20 7a 4e 61 6d  urn true if zNam
f270: 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 74 61  e is a shadow ta
f280: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
f290: 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
f2a0: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
f2b0: 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74  **.** zName is t
f2c0: 65 6d 70 6f 72 61 72 69 6c 79 20 6d 6f 64 69 66  emporarily modif
f2d0: 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 72  ied while this r
f2e0: 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e  outine is runnin
f2f0: 67 2c 20 62 75 74 20 69 73 0a 2a 2a 20 72 65 73  g, but is.** res
f300: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f310: 67 69 6e 61 6c 20 76 61 6c 75 65 20 70 72 69 6f  ginal value prio
f320: 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
f330: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
f340: 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 68 61  static int isSha
f350: 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 73 71 6c  dowTableName(sql
f360: 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20 2a  ite3 *db, char *
f370: 7a 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  zName){.  char *
f380: 7a 54 61 69 6c 3b 20 20 20 20 20 20 20 20 20 20  zTail;          
f390: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f3a0: 65 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 22  er to the last "
f3b0: 5f 22 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  _" in zName */. 
f3c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f3e0: 2a 20 54 61 62 6c 65 20 74 68 61 74 20 7a 4e 61  * Table that zNa
f3f0: 6d 65 20 69 73 20 61 20 73 68 61 64 6f 77 20 6f  me is a shadow o
f400: 66 20 2a 2f 0a 20 20 4d 6f 64 75 6c 65 20 2a 70  f */.  Module *p
f410: 4d 6f 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mod;            
f420: 20 20 20 20 20 2f 2a 20 4d 6f 64 75 6c 65 20 66       /* Module f
f430: 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
f440: 61 62 6c 65 20 2a 2f 0a 0a 20 20 7a 54 61 69 6c  able */..  zTail
f450: 20 3d 20 73 74 72 72 63 68 72 28 7a 4e 61 6d 65   = strrchr(zName
f460: 2c 20 27 5f 27 29 3b 0a 20 20 69 66 28 20 7a 54  , '_');.  if( zT
f470: 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ail==0 ) return 
f480: 30 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  0;.  *zTail = 0;
f490: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
f4a0: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
f4b0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 2a 7a 54 61  Name, 0);.  *zTa
f4c0: 69 6c 20 3d 20 27 5f 27 3b 0a 20 20 69 66 28 20  il = '_';.  if( 
f4d0: 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
f4e0: 20 30 3b 0a 20 20 69 66 28 20 21 49 73 56 69 72   0;.  if( !IsVir
f4f0: 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
f500: 75 72 6e 20 30 3b 0a 20 20 70 4d 6f 64 20 3d 20  urn 0;.  pMod = 
f510: 28 4d 6f 64 75 6c 65 2a 29 73 71 6c 69 74 65 33  (Module*)sqlite3
f520: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d  HashFind(&db->aM
f530: 6f 64 75 6c 65 2c 20 70 54 61 62 2d 3e 61 7a 4d  odule, pTab->azM
f540: 6f 64 75 6c 65 41 72 67 5b 30 5d 29 3b 0a 20 20  oduleArg[0]);.  
f550: 69 66 28 20 70 4d 6f 64 3d 3d 30 20 29 20 72 65  if( pMod==0 ) re
f560: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4d  turn 0;.  if( pM
f570: 6f 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 69 56 65  od->pModule->iVe
f580: 72 73 69 6f 6e 3c 33 20 29 20 72 65 74 75 72 6e  rsion<3 ) return
f590: 20 30 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e   0;.  if( pMod->
f5a0: 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77  pModule->xShadow
f5b0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
f5c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 6f   0;.  return pMo
f5d0: 64 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 53 68 61  d->pModule->xSha
f5e0: 64 6f 77 4e 61 6d 65 28 7a 54 61 69 6c 2b 31 29  dowName(zTail+1)
f5f0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
f600: 6e 65 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65  ne isShadowTable
f610: 4e 61 6d 65 28 78 2c 79 29 20 30 0a 23 65 6e 64  Name(x,y) 0.#end
f620: 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  if /* ifndef SQL
f630: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f640: 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
f650: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f660: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
f670: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
f680: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
f690: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
f6a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
f6b0: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
f6c0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
f6d0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
f6e0: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
f6f0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
f700: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
f710: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
f720: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
f730: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
f740: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
f750: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
f760: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
f770: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
f780: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
f790: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
f7a0: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
f7b0: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
f7c0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
f7d0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
f7e0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
f7f0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f800: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
f810: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
f820: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
f830: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
f840: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f850: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
f860: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
f870: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
f880: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
f890: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
f8a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f8b0: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
f8c0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
f8d0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
f8e0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
f8f0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
f900: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
f910: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
f920: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
f930: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
f940: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
f950: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
f960: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
f970: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
f980: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
f990: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
f9a0: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
f9b0: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
f9c0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
f9d0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
f9e0: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
f9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
fa00: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
fa10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
fa20: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
fa30: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
fa40: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
fa50: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
fa60: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
fa70: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
fa80: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
fa90: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
faa0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
fab0: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
fac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
fad0: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
fae0: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
faf0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
fb00: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
fb10: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
fb20: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
fb30: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
fb40: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
fb50: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
fb60: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
fb70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fb80: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
fb90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
fba0: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbc0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
fbd0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
fbe0: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
fbf0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
fc00: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
fc10: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
fc20: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e  le */..  if( pEn
fc30: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
fc40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
fc50: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fc60: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
fc70: 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  d );.  p = pPars
fc80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
fc90: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
fca0: 6e 3b 0a 0a 20 20 69 66 28 20 70 53 65 6c 65 63  n;..  if( pSelec
fcb0: 74 3d 3d 30 20 26 26 20 69 73 53 68 61 64 6f 77  t==0 && isShadow
fcc0: 54 61 62 6c 65 4e 61 6d 65 28 64 62 2c 20 70 2d  TableName(db, p-
fcd0: 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 70  >zName) ){.    p
fce0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
fcf0: 5f 53 68 61 64 6f 77 3b 0a 20 20 7d 0a 0a 20 20  _Shadow;.  }..  
fd00: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
fd10: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
fd20: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
fd30: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
fd40: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
fd50: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
fd60: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
fd70: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
fd80: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
fd90: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
fda0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
fdb0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
fdc0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
fdd0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
fde0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
fdf0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
fe00: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
fe10: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
fe20: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
fe30: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
fe40: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
fe50: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
fe60: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
fe70: 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
fe80: 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
fe90: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
fea0: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
feb0: 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
fec0: 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
fed0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
fee0: 7b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  {.    if( pSelec
fef0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
ff00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
ff10: 65 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65  e, "");.      re
ff20: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
ff30: 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  p->tnum = db->in
ff40: 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
ff50: 69 66 28 20 70 2d 3e 74 6e 75 6d 3d 3d 31 20 29  if( p->tnum==1 )
ff60: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
ff70: 54 46 5f 52 65 61 64 6f 6e 6c 79 3b 0a 20 20 7d  TF_Readonly;.  }
ff80: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
ff90: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57 49  rocessing for WI
ffa0: 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c  THOUT ROWID Tabl
ffb0: 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61 62 4f  es */.  if( tabO
ffc0: 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f 75 74  pts & TF_Without
ffd0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ffe0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
fff0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
10000 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
10010 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10020 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 41 55  e,.          "AU
10030 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f 74 20  TOINCREMENT not 
10040 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54 48 4f  allowed on WITHO
10050 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 22  UT ROWID tables"
10060 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
10070 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
10080 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
10090 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 29 3d  _HasPrimaryKey)=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
100b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
100c0 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59  se, "PRIMARY KEY
100d0 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61 62 6c   missing on tabl
100e0 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  e %s", p->zName)
100f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10100 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c     p->tabFlags |
10110 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69  = TF_WithoutRowi
10120 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  d | TF_NoVisible
10130 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
10140 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
10150 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
10160 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
10170 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10180 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10190 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
101a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
101b0 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
101c0 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
101d0 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
101e0 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
101f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
10200 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
10210 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
10220 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
10230 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
10240 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
10250 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10260 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10270 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
10280 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
10290 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
102a0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
102b0 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
102c0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
102d0 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
102e0 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
102f0 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
10300 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
10310 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
10320 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
10330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
10340 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
10350 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
10360 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
10370 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
10380 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
10390 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
103a0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
103b0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
103c0 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
103d0 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
103e0 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
103f0 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
10400 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
10410 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
10420 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
10430 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
10440 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
10450 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
10460 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
10470 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
10480 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
10490 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
104a0 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
104b0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
104c0 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
104d0 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
104e0 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
104f0 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
10500 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
10510 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10520 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
10530 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
10540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10550 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
10560 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
10570 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
10580 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
10590 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
105a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
105b0 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
105c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
105d0 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
105e0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
105f0 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
10600 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
10610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10620 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
10630 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
10640 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
10650 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
10660 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
10670 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
10680 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
10690 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
106a0 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
106b0 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
106c0 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
106d0 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
106e0 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
106f0 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
10700 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
10710 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
10720 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
10730 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
10740 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
10750 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
10760 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
10770 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
10780 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
10790 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
107a0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
107b0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
107c0 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
107d0 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
107e0 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
107f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
10800 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
10810 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
10820 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
10830 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
10840 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
10850 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
10860 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
10870 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
10880 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
10890 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
108a0 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
108b0 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
108c0 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
108d0 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
108e0 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
108f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
10900 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
10910 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
10920 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 53    /* Where the S
10930 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73 74 6f  ELECT should sto
10940 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  re results */.  
10950 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
10960 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  ;       /* Regis
10970 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 2d 72  ter holding co-r
10980 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70 6f 69  outine entry-poi
10990 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
109a0 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
109b0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 63 6f  /* Top of the co
109c0 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
109d0 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20 20 20    int regRec;   
109e0 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63 6f 72        /* A recor
109f0 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 20 69  d to be insert i
10a00 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c  nto the new tabl
10a10 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
10a20 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20 20 2f  egRowid;       /
10a30 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65 20 6e  * Rowid of the n
10a40 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73 65 72  ext row to inser
10a50 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
10a60 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20 20 2f  ddrInsLoop;    /
10a70 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
10a80 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  p for inserting 
10a90 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20 54 61  rows */.      Ta
10aa0 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20  ble *pSelTab;   
10ab0 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74 68 61    /* A table tha
10ac0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
10ad0 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a  SELECT results *
10ae0 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69 65 6c  /..      regYiel
10af0 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b00 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 65 63  em;.      regRec
10b10 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10b20 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69  m;.      regRowi
10b30 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
10b40 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
10b50 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 31  (pParse->nTab==1
10b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b70 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
10b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10b90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10ba0 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20 70 50  OpenWrite, 1, pP
10bb0 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 20 69  arse->regRoot, i
10bc0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
10bd0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10be0 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47  , OPFLAG_P2ISREG
10bf0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
10c00 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  >nTab = 2;.     
10c10 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
10c20 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10c30 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  r(v) + 1;.      
10c40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c50 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
10c60 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c  utine, regYield,
10c70 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
10c80 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
10c90 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
10ca0 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
10cb0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
10cc0 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
10cd0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
10ce0 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
10cf0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61   return;.      a
10d00 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d  ssert( p->aCol==
10d10 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43  0 );.      p->nC
10d20 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
10d30 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
10d40 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
10d50 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
10d60 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10d70 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
10d80 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10d90 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10da0 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
10db0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10dc0 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
10dd0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
10de0 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
10df0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10e00 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
10e10 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
10e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
10e30 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
10e40 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
10e50 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
10e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10e80 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
10e90 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
10ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10eb0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
10ec0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
10ed0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10ee0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
10ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10f00 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
10f10 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
10f20 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
10f30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
10f40 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
10f50 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
10f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10f70 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10f80 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10f90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fa0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
10fb0 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
10fc0 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10fd0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
10fe0 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11000 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11010 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
11020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11030 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
11040 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
11050 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
11060 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
11070 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
11080 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
11090 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
110a0 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
110b0 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
110c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
110d0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
110e0 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
110f0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
11100 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
11110 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
11120 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
11130 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
11140 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
11150 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
11160 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
11170 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11180 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
11190 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
111a0 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
111b0 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
111c0 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
111d0 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
111e0 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
111f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11200 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
11210 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
11220 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
11230 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
11240 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
11250 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
11260 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
11270 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
11280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
11290 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
112a0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
112b0 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
112c0 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
112d0 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
112e0 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
112f0 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
11300 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
11310 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
11320 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
11330 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
11340 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
11350 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
11360 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
11370 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
11380 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
11390 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
113a0 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
113b0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
113c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
113d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
113e0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
113f0 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
11400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11410 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
11420 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
11430 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
11440 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
11450 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
11460 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
11470 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
11480 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
11490 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
114a0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
114b0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
114c0 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
114d0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
114e0 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
114f0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11500 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
11510 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
11520 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
11530 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
11540 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
11550 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11560 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
11570 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
11580 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
11590 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
115a0 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
115b0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
115c0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
115d0 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
115e0 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
115f0 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11600 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
11610 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
11620 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
11630 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
11640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
11650 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
11660 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
11670 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
11680 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
11690 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
116a0 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
116b0 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
116c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
116d0 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
116e0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
116f0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
11700 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
11710 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
11720 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
11730 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11740 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
11750 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
11760 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
11770 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
11780 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
11790 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
117a0 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
117b0 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
117c0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
117d0 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
117e0 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
117f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
11800 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
11810 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
11820 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
11830 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
11840 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
11850 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
11860 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
11870 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
11880 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
11890 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
118a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
118b0 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
118c0 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
118d0 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
118e0 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
118f0 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
11900 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
11910 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
11920 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
11930 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
11940 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11950 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
11960 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
11970 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
11980 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
11990 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
119a0 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
119b0 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
119c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
119d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
119e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
119f0 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
11a00 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
11a10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
11a20 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
11a30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
11a40 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
11a50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
11a60 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11a70 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
11a80 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
11a90 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
11aa0 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
11ab0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
11ac0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
11ad0 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
11ae0 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
11af0 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
11b00 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
11b10 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
11b20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
11b30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
11b40 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
11b50 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
11b60 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
11b70 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
11b80 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
11b90 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
11ba0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11bb0 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
11bc0 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
11bd0 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
11be0 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
11bf0 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
11c00 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
11c10 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
11c20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
11c30 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
11c40 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
11c50 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
11c60 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
11c70 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
11c80 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
11c90 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
11ca0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
11cb0 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
11cc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11cd0 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
11ce0 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
11cf0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11d00 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
11d10 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
11d20 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
11d30 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
11d40 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
11d50 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
11d60 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
11d70 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
11d80 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
11d90 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
11da0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
11db0 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
11dc0 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
11dd0 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
11de0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
11df0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
11e00 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
11e10 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
11e20 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
11e30 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
11e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
11e50 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
11e60 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
11e70 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
11e80 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
11e90 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
11ea0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
11eb0 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
11ec0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
11ed0 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
11ee0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
11ef0 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
11f00 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
11f10 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
11f20 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
11f30 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
11f40 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
11f50 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
11f60 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
11f70 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
11f80 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
11f90 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
11fa0 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
11fb0 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
11fc0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
11fd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52  .  */.  if( IN_R
11fe0 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
11ff0 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
12000 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53   pSelect;.    pS
12010 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  elect = 0;.  }el
12020 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65  se{.    p->pSele
12030 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
12040 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
12050 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
12060 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68  E);.  }.  p->pCh
12070 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
12080 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
12090 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
120a0 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
120b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
120c0 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
120d0 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
120e0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
120f0 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
12100 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
12110 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
12120 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
12130 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
12140 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
12150 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
12160 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d  ]!=0 || sEnd.n==
12170 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  0 );.  if( sEnd.
12180 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
12190 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
121a0 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
121b0 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
121c0 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
121d0 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
121e0 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n>0 );.  z = pBe
121f0 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
12200 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
12210 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
12220 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
12230 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
12240 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
12250 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
12260 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
12270 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
12280 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
12290 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
122a0 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
122b0 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65  , 0, 0);..create
122c0 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71  _view_fail:.  sq
122d0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
122e0 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
122f0 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
12300 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
12310 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c  lite3RenameExprl
12320 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  istUnmap(pParse,
12330 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20   pCNames);.  }. 
12340 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12350 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
12360 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
12370 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12380 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
12390 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
123a0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
123b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
123c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
123d0 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
123e0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
123f0 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
12400 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
12410 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
12420 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
12430 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
12440 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
12450 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
12460 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
12470 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
12480 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
12490 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
124a0 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
124b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
124c0 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
124d0 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
124e0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
124f0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
12500 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
12510 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
12520 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
12530 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
12540 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
12550 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
12560 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
12570 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
12580 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
12590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
125a0 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
125b0 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
125c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
125d0 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
125e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
125f0 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
12600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12610 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
12620 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12630 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
12640 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
12650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12660 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
12670 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nt rc;.#endif.#i
12680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12690 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
126a0 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
126b0 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20  xAuth;       /* 
126c0 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e  Saved xAuth poin
126d0 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ter */.#endif.. 
126e0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
126f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
12700 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12710 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65  ABLE.  db->nSche
12720 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d  maLock++;.  rc =
12730 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
12740 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
12750 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e  pTable);.  db->n
12760 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20  SchemaLock--;.  
12770 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
12780 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
12790 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
127a0 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
127b0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
127c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
127d0 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
127e0 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
127f0 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
12800 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
12810 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
12820 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
12830 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
12840 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
12850 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
12860 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
12870 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
12880 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
12890 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
128a0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
128b0 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
128c0 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
128d0 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
128e0 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
128f0 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
12900 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
12910 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
12920 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
12930 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
12940 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
12950 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
12960 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
12970 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
12980 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
12990 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
129a0 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
129b0 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
129c0 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
129d0 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
129e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
129f0 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
12a00 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
12a10 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
12a20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
12a30 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
12a40 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
12a50 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
12a60 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
12a70 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
12a80 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
12a90 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
12aa0 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
12ab0 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
12ac0 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
12ad0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12ae0 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
12af0 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
12b00 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
12b10 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
12b20 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
12b30 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
12b40 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
12b50 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
12b60 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
12b70 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
12b80 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
12b90 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
12ba0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
12bb0 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
12bc0 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
12bd0 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
12be0 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
12bf0 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
12c00 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
12c10 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
12c20 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
12c30 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
12c40 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
12c50 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
12c60 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
12c70 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
12c80 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
12c90 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
12ca0 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
12cb0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
12cc0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
12cd0 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
12ce0 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
12cf0 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
12d00 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
12d10 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
12d20 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
12d30 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65  ( pSel ){.#ifnde
12d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
12d50 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20  TERTABLE.    u8 
12d60 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61  eParseMode = pPa
12d70 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b  rse->eParseMode;
12d80 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
12d90 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f  rseMode = PARSE_
12da0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e  MODE_NORMAL;.#en
12db0 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  dif.    n = pPar
12dc0 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
12dd0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
12de0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
12df0 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
12e00 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
12e10 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = -1;.    db->lo
12e20 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65  okaside.bDisable
12e30 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
12e40 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
12e50 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20  ATION.    xAuth 
12e60 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20  = db->xAuth;.   
12e70 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a   db->xAuth = 0;.
12e80 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
12e90 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
12ea0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12eb0 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41  Sel);.    db->xA
12ec0 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c  uth = xAuth;.#el
12ed0 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  se.    pSelTab =
12ee0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
12ef0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
12f00 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a  , pSel);.#endif.
12f10 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
12f20 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 54   = n;.    if( pT
12f30 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  able->pCheck ){.
12f40 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45 20        /* CREATE 
12f50 56 49 45 57 20 6e 61 6d 65 28 61 72 67 6c 69 73  VIEW name(arglis
12f60 74 29 20 41 53 20 2e 2e 2e 0a 20 20 20 20 20 20  t) AS ....      
12f70 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66 20  ** The names of 
12f80 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  the columns in t
12f90 68 65 20 74 61 62 6c 65 20 61 72 65 20 74 61 6b  he table are tak
12fa0 65 6e 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  en from.      **
12fb0 20 61 72 67 6c 69 73 74 20 77 68 69 63 68 20 69   arglist which i
12fc0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 54 61 62  s stored in pTab
12fd0 6c 65 2d 3e 70 43 68 65 63 6b 2e 20 20 54 68 65  le->pCheck.  The
12fe0 20 70 43 68 65 63 6b 20 66 69 65 6c 64 0a 20 20   pCheck field.  
12ff0 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20      ** normally 
13000 68 6f 6c 64 73 20 43 48 45 43 4b 20 63 6f 6e 73  holds CHECK cons
13010 74 72 61 69 6e 74 73 20 6f 6e 20 61 6e 20 6f 72  traints on an or
13020 64 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 62 75  dinary table, bu
13030 74 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  t for.      ** a
13040 20 56 49 45 57 20 69 74 20 68 6f 6c 64 73 20 74   VIEW it holds t
13050 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
13060 6e 20 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 2a  n names..      *
13070 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  /.      sqlite3C
13080 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
13090 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  st(pParse, pTabl
130a0 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  e->pCheck, .    
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
130d0 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
130e0 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  ble->aCol);.    
130f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13100 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20  Failed==0 .     
13110 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72    && pParse->nEr
13120 72 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  r==0.       && p
13130 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65  Table->nCol==pSe
13140 6c 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  l->pEList->nExpr
13150 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13160 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
13170 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
13180 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
13190 20 70 54 61 62 6c 65 2c 20 70 53 65 6c 29 3b 0a   pTable, pSel);.
131a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
131b0 65 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b  e if( pSelTab ){
131c0 0a 20 20 20 20 20 20 2f 2a 20 43 52 45 41 54 45  .      /* CREATE
131d0 20 56 49 45 57 20 6e 61 6d 65 20 41 53 2e 2e 2e   VIEW name AS...
131e0 20 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67    without an arg
131f0 75 6d 65 6e 74 20 6c 69 73 74 2e 20 20 43 6f 6e  ument list.  Con
13200 73 74 72 75 63 74 0a 20 20 20 20 20 20 2a 2a 20  struct.      ** 
13210 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
13220 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54   from the SELECT
13230 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
13240 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
13250 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13260 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
13270 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
13280 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
13290 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
132a0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
132b0 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
132c0 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
132d0 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
132e0 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
132f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13300 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
13310 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
13320 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
13330 61 29 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  a) );.    }else{
13340 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e  .      pTable->n
13350 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e  Col = 0;.      n
13360 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Err++;.    }.   
13370 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
13380 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
13390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
133a0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
133b0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  el);.    db->loo
133c0 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 2d  kaside.bDisable-
133d0 2d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  -;.#ifndef SQLIT
133e0 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
133f0 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50  E.    pParse->eP
13400 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61 72 73  arseMode = ePars
13410 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 20 20  eMode;.#endif.  
13420 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
13430 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  r++;.  }.  pTabl
13440 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  e->pSchema->sche
13450 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e  maFlags |= DB_Un
13460 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 66  resetViews;.  if
13470 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13480 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
13490 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
134a0 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
134b0 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c      pTable->aCol
134c0 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c 65   = 0;.    pTable
134d0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->nCol = 0;.  }.
134e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
134f0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
13500 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
13510 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
13520 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13530 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
13540 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13550 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
13560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13570 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
13580 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
13590 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
135a0 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
135b0 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
135c0 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
135d0 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
135e0 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
135f0 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
13600 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13610 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13620 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20  db, idx, 0) );. 
13630 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
13640 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
13650 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
13660 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
13670 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
13680 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
13690 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
136a0 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
136b0 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
136c0 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
136d0 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
136e0 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
136f0 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
13700 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
13710 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 3b  Names(db, pTab);
13720 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  .      pTab->aCo
13730 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 61  l = 0;.      pTa
13740 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
13750 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
13760 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
13770 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
13780 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
13790 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
137a0 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
137b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
137c0 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
137d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
137e0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
137f0 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
13800 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
13810 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
13820 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
13830 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
13840 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
13850 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
13860 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
13870 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
13880 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
13890 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
138a0 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
138b0 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
138c0 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
138d0 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
138e0 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
138f0 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
13900 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
13910 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
13920 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
13930 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
13940 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
13950 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
13960 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
13970 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
13980 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
13990 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
139a0 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
139b0 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
139c0 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
139d0 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
139e0 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
139f0 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
13a00 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
13a10 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
13a20 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13a30 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
13a40 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
13a50 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
13a60 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
13a70 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
13a80 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
13a90 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
13aa0 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
13ab0 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
13ac0 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
13ad0 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
13ae0 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
13af0 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
13b00 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
13b10 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
13b20 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
13b30 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
13b40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13b50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
13b60 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
13b70 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a 64  Moved(sqlite3 *d
13b80 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
13b90 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
13ba0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
13bb0 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
13bc0 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  h;.  Db *pDb;.. 
13bd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13be0 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
13bf0 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
13c00 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
13c10 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20  iDb];.  pHash = 
13c20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
13c30 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  blHash;.  for(pE
13c40 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
13c50 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
13c60 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
13c70 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
13c80 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
13c90 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
13ca0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
13cb0 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pTab->tnum==iF
13cc0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61  rom ){.      pTa
13cd0 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  b->tnum = iTo;. 
13ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68     }.  }.  pHash
13cf0 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
13d00 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72  ->idxHash;.  for
13d10 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
13d20 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
13d30 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
13d40 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
13d50 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  )){.    Index *p
13d60 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Idx = sqliteHash
13d70 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
13d80 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d   if( pIdx->tnum=
13d90 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
13da0 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pIdx->tnum = iTo
13db0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13dc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
13dd0 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  e code to erase 
13de0 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
13df0 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
13e00 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44  from database iD
13e10 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65  b..** Also write
13e20 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20   code to modify 
13e30 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
13e40 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65  r table and inte
13e50 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69  rnal schema.** i
13e60 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  f a root-page of
13e70 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
13e80 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
13e90 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73  tree-layer whils
13ea0 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61  t.** erasing iTa
13eb0 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61  ble (this can ha
13ec0 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74  ppen with an aut
13ed0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
13ee0 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  e)..*/ .static v
13ef0 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  oid destroyRootP
13f00 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  age(Parse *pPars
13f10 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  e, int iTable, i
13f20 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
13f30 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
13f40 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
13f50 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
13f60 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13f70 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  );.  if( iTable<
13f80 32 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  2 ) sqlite3Error
13f90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72  Msg(pParse, "cor
13fa0 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b 0a 20  rupt schema");. 
13fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13fc0 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79  p3(v, OP_Destroy
13fd0 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44  , iTable, r1, iD
13fe0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79  b);.  sqlite3May
13ff0 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23  Abort(pParse);.#
14000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14010 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14020 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74  /* OP_Destroy st
14030 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67  ores an in integ
14040 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69  er r1. If this i
14050 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e  nteger.  ** is n
14060 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
14070 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
14080 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61  e number of a ta
14090 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  ble moved to.  *
140a0 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c  * location iTabl
140b0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
140c0 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74   code modifies t
140d0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
140e0 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72   table to.  ** r
140f0 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a  eflect this..  *
14100 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e  *.  ** The "#NNN
14110 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20  " in the SQL is 
14120 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61  a special consta
14130 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68  nt that means wh
14140 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a  atever value.  *
14150 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  * is in register
14160 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d   NNN.  See gramm
14170 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61  ar rules associa
14180 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f  ted with the TK_
14190 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f  REGISTER.  ** to
141a0 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ken for addition
141b0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
141c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
141d0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
141e0 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
141f0 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
14200 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
14210 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
14220 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
14230 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
14240 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  SName, MASTER_NA
14250 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  ME, iTable, r1, 
14260 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
14270 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14280 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
14290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
142a0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
142b0 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
142c0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
142d0 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
142e0 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
142f0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
14300 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
14310 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
14320 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
14330 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
14340 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
14350 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
14360 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
14370 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
14380 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
14390 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
143a0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
143b0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
143c0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
143d0 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
143e0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
143f0 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  ab){.  /* If the
14400 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
14410 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
14420 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
14430 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14440 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
14450 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
14460 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
14470 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
14480 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
14490 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
144a0 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
144b0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
144c0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
144d0 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
144e0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
144f0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
14500 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
14510 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
14520 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
14530 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
14540 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
14550 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
14560 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
14570 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
14580 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
14590 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
145a0 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
145b0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
145c0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
145d0 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
145e0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
145f0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
14600 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
14610 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
14620 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
14630 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
14640 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
14650 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
14660 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
14670 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
14680 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
14690 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
146a0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
146b0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
146c0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
146d0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
146e0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
146f0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
14700 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
14710 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
14720 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
14730 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
14740 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
14750 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
14760 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
14770 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
14780 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
14790 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
147a0 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
147b0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
147c0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
147d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
147e0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
147f0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
14800 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
14810 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
14820 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
14830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14840 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
14850 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
14860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14870 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
14880 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
14890 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
148a0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
148b0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
148c0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
148d0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
148e0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
148f0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
14900 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
14910 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
14920 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
14930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
14940 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
14950 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
14960 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
14970 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
14980 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
14990 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
149a0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
149b0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
149c0 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
149d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
149e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
149f0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
14a00 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
14a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14a20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
14a30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14a40 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
14a50 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
14a60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14a70 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
14a80 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
14a90 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
14aa0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
14ab0 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
14ac0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
14ad0 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  zDbSName;.  for(
14ae0 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
14af0 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
14b00 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
14b10 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
14b20 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
14b30 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
14b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
14b50 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
14b60 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
14b70 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
14b80 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
14b90 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
14ba0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
14bb0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
14bc0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
14bd0 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
14be0 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
14bf0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14c00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14c10 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
14c20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
14c30 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
14c40 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
14c50 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
14c60 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
14c70 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
14c80 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14c90 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
14ca0 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
14cb0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
14cc0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
14cd0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14ce0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
14cf0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
14d00 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14d10 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14d20 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
14d30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
14d40 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
14d50 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
14d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14d70 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
14d80 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
14d90 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
14da0 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
14db0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
14dc0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
14dd0 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
14de0 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
14df0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
14e00 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
14e10 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
14e20 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
14e30 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
14e40 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
14e50 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
14e60 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
14e70 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
14e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
14e90 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
14ea0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
14eb0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
14ec0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
14ed0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
14ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
14ef0 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
14f00 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
14f10 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
14f20 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
14f30 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
14f40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
14f50 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
14f60 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
14f70 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
14f80 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
14f90 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
14fa0 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
14fb0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
14fc0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
14fd0 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
14fe0 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
14ff0 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
15000 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
15010 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
15020 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
15030 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
15040 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
15050 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
15060 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
15070 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
15080 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
15090 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
150a0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
150b0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
150c0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
150d0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
150e0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
150f0 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 4e        pDb->zDbSN
15100 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
15110 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
15120 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
15130 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
15140 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
15150 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
15160 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
15170 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
15180 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
15190 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
151a0 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
151b0 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
151c0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
151d0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
151e0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
151f0 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
15200 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
15210 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
15220 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
15230 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
15240 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
15250 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
15260 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
15270 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
15280 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
15290 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
152a0 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
152b0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
152c0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
152d0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
152e0 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
152f0 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
15300 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b->zDbSName, MAS
15310 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62 2d 3e  TER_NAME, pTab->
15320 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
15330 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
15340 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15350 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
15360 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
15370 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
15380 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
15390 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
153a0 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
153b0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
153c0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
153d0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
153e0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
153f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15400 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
15410 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
15420 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
15430 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
15440 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
15450 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15460 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
15470 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
15480 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
15490 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
154a0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
154b0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
154c0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
154d0 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
154e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
154f0 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
15500 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
15510 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
15520 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
15530 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
15540 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
15550 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
15560 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
15570 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
15580 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
15590 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
155a0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
155b0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
155c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
155d0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
155e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
155f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
15600 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15610 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
15620 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
15630 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15640 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
15650 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
15660 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
15670 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72  ) ) goto exit_dr
15680 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20  op_table;.  if( 
15690 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
156a0 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73  ressErr++;.  ass
156b0 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c  ert( isView==0 |
156c0 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45  | isView==LOCATE
156d0 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20  _VIEW );.  pTab 
156e0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
156f0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
15700 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
15710 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
15720 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
15730 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
15740 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
15750 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
15760 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
15770 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
15780 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
15790 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
157a0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
157b0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
157c0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
157d0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
157e0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
157f0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
15800 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
15810 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
15820 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
15830 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
15840 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
15850 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
15860 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
15870 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
15880 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
15890 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
158a0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
158b0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
158c0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
158d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
158e0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
158f0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
15900 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
15910 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
15920 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
15930 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
15940 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
15950 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  zDbSName;.    co
15960 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
15970 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
15980 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15990 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
159a0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
159b0 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
159c0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
159d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
159e0 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
159f0 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
15a00 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
15a10 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
15a20 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
15a30 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
15a40 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
15a50 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
15a60 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
15a70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
15a80 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
15a90 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
15aa0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
15ab0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
15ac0 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
15ad0 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
15ae0 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
15af0 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
15b00 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
15b10 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
15b20 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
15b30 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
15b40 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
15b50 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
15b60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15b70 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
15b80 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
15b90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15ba0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
15bb0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
15bc0 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
15bd0 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
15be0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15bf0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
15c00 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
15c10 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15c20 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
15c30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
15c40 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
15c50 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
15c60 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
15c70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
15c80 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
15c90 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
15ca0 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
15cb0 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
15cc0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
15cd0 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
15ce0 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
15cf0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
15d00 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
15d10 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
15d20 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
15d30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
15d40 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
15d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d60 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
15d70 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
15d80 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
15d90 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
15da0 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
15db0 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
15dc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
15dd0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
15de0 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
15df0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15e00 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
15e10 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
15e20 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
15e30 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
15e40 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
15e50 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
15e60 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
15e70 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
15e80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15e90 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
15ea0 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
15eb0 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
15ec0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
15ed0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
15ee0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
15ef0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15f00 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
15f10 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
15f20 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
15f30 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
15f40 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15f50 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15f60 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
15f70 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
15f80 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
15f90 20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21   iDb);.    if( !
15fa0 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
15fb0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
15fc0 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
15fd0 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d  Db, "tbl", pTab-
15fe0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
15ff0 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c  qlite3FkDropTabl
16000 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c  e(pParse, pName,
16010 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
16020 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
16030 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
16040 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
16050 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
16060 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
16070 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
16080 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
16090 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
160a0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
160b0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
160c0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
160d0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
160e0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
160f0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
16100 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
16110 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
16120 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
16130 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
16140 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
16150 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
16160 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
16170 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
16180 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
16190 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
161a0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
161b0 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
161c0 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
161d0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
161e0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
161f0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
16200 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
16210 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
16220 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
16230 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
16240 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
16250 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
16260 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
16270 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
16280 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
16290 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
162a0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
162b0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
162c0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
162d0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
162e0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
162f0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
16300 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
16310 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
16320 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
16330 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
16340 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
16350 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
16360 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
16370 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
16380 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
16390 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
163a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
163b0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
163c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
163d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
163e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
163f0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
16400 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
16410 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
16420 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
16430 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
16440 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
16450 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16460 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
16470 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
16480 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
16490 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
164a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
164b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
164c0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
164d0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
164e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
164f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
16500 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
16510 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
16520 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
16530 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
16540 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
16550 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
16560 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
16570 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
16580 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
16590 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
165a0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
165b0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
165c0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
165d0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
165e0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
165f0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
16600 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
16610 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
16620 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
16630 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
16640 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
16650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
16660 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
16670 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
16680 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
16690 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
166a0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
166b0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
166c0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
166d0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
166e0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
166f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
16700 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
16710 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
16720 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
16730 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
16740 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16750 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
16760 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
16770 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
16780 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
16790 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
167a0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
167b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
167c0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
167d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
167e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
167f0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
16800 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
16810 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
16820 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
16830 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
16840 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
16850 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
16860 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
16870 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
16880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
16890 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
168a0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
168b0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
168c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
168d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
168e0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
168f0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
16900 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
16910 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
16920 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
16930 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
16940 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
16950 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
16960 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
16970 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
16980 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
16990 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73  _OBJECT ){.    s
169a0 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
169b0 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f  nMap(pParse, (vo
169c0 69 64 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d  id*)z, pTo);.  }
169d0 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
169e0 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
169f0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
16a00 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
16a10 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
16a20 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
16a30 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
16a40 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
16a50 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
16a60 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
16a70 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
16a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
16a90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
16aa0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
16ab0 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
16ac0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
16ad0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
16ae0 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
16af0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
16b00 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
16b10 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
16b20 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
16b30 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
16b40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16b60 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
16b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
16b80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
16b90 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
16ba0 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
16bb0 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
16bc0 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
16bd0 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
16be0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
16bf0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
16c00 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
16c10 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
16c20 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
16c30 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
16c40 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
16c50 2c 20 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69  , &pFKey->aCol[i
16c60 5d 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  ], pFromCol->a[i
16c70 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
16c80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
16c90 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
16ca0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
16cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
16cc0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
16cd0 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
16ce0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
16cf0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  pFKey->aCol[i].z
16d00 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69  Col = z;.      i
16d10 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
16d20 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
16d30 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
16d40 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a  nRemap(pParse, z
16d50 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
16d60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
16d70 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
16d80 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
16d90 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
16da0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
16db0 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
16dc0 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
16dd0 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
16de0 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20  y->aAction[0] = 
16df0 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
16e00 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  f);            /
16e10 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69  * ON DELETE acti
16e20 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61  on */.  pFKey->a
16e30 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29  Action[1] = (u8)
16e40 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
16e50 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e   0xff);    /* ON
16e60 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a   UPDATE action *
16e70 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
16e80 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
16e90 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53  eld(db, 0, p->pS
16ea0 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78  chema) );.  pNex
16eb0 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71  tTo = (FKey *)sq
16ec0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
16ed0 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65  &p->pSchema->fke
16ee0 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46  yHash, .      pF
16ef0 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20  Key->zTo, (void 
16f00 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69  *)pFKey.  );.  i
16f10 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65  f( pNextTo==pFKe
16f20 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
16f30 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
16f40 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
16f50 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f   }.  if( pNextTo
16f60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16f70 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
16f80 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79  ==0 );.    pFKey
16f90 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78  ->pNextTo = pNex
16fa0 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f  tTo;.    pNextTo
16fb0 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65  ->pPrevTo = pFKe
16fc0 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e  y;.  }..  /* Lin
16fd0 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  k the foreign ke
16fe0 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61  y to the table a
16ff0 73 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e  s the last step.
17000 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79  .  */.  p->pFKey
17010 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65   = pFKey;.  pFKe
17020 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a  y = 0;..fk_end:.
17030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17040 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64  db, pFKey);.#end
17050 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
17060 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
17070 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
17080 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
17090 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29  te(db, pFromCol)
170a0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
170b0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
170c0 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oCol);.}../*.** 
170d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
170e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
170f0 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41  NITIALLY IMMEDIA
17100 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  TE or INITIALLY 
17110 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75  DEFERRED.** clau
17120 73 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61  se is seen as pa
17130 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20  rt of a foreign 
17140 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20  key definition. 
17150 20 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a   The isDeferred.
17160 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17170 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  1 for INITIALLY 
17180 44 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66  DEFERRED and 0 f
17190 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  or INITIALLY IMM
171a0 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62  EDIATE..** The b
171b0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d  ehavior of the m
171c0 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
171d0 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  ated foreign key
171e0 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20   is adjusted.** 
171f0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
17200 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65  void sqlite3Defe
17210 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73  rForeignKey(Pars
17220 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
17230 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e  sDeferred){.#ifn
17240 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17250 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61  FOREIGN_KEY.  Ta
17260 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65  ble *pTab;.  FKe
17270 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20  y *pFKey;.  if( 
17280 28 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  (pTab = pParse->
17290 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c  pNewTable)==0 ||
172a0 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e   (pFKey = pTab->
172b0 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75  pFKey)==0 ) retu
172c0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  rn;.  assert( is
172d0 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69  Deferred==0 || i
172e0 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20  sDeferred==1 ); 
172f0 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32  /* EV: R-30323-2
17300 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d  1917 */.  pFKey-
17310 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75  >isDeferred = (u
17320 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  8)isDeferred;.#e
17330 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
17340 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
17350 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
17360 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
17370 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
17380 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
17390 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
173a0 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
173b0 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
173c0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
173d0 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
173e0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
173f0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
17400 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
17410 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
17420 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
17430 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
17440 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
17450 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
17460 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
17470 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
17480 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
17490 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
174a0 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
174b0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
174c0 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
174d0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
174e0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
174f0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
17500 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
17510 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
17520 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
17530 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
17540 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
17550 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
17560 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
17570 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
17580 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
17590 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
175a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
175b0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
175c0 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
175d0 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
175e0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
175f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
17600 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
17610 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
17620 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
17630 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
17640 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
17650 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
17660 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  x */.  int iSort
17670 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
17680 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17690 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f  opened by OpenSo
176a0 72 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29  rter (if in use)
176b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b   */.  int addr1;
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
176e0 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a  of top of loop *
176f0 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20  /.  int addr2;  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f     /* Address to
17720 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78   jump to for nex
17730 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  t iteration */. 
17740 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17770 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
17780 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20  PartIdxLabel;   
17790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
177a0 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20  p to this label 
177b0 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f  to skip a row */
177c0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
177f0 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72  de into this vir
17800 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a  tual machine */.
17810 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20   /* KeyInfo for 
17840 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72  index */.  int r
17850 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
17860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
17870 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
17880 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65  sembled index re
17890 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
178a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
178b0 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  db;      /* The 
178c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
178d0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
178e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
178f0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
17900 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23  ex->pSchema);..#
17910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17920 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
17930 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
17940 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17950 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20  SQLITE_REINDEX, 
17960 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
17970 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
17980 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20  iDb].zDbSName ) 
17990 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
179a0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
179b0 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
179c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
179d0 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
179e0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
179f0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
17a00 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
17a10 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
17a20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
17a30 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
17a40 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
17a50 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
17a60 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
17a70 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
17a80 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
17a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
17aa0 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
17ab0 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
17ac0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
17ad0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
17ae0 64 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dex);.  assert( 
17af0 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  pKey!=0 || db->m
17b00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
17b10 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a  Parse->nErr );..
17b20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f    /* Open the so
17b30 72 74 65 72 20 63 75 72 73 6f 72 20 69 66 20 77  rter cursor if w
17b40 65 20 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65  e are to use one
17b50 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d  . */.  iSorter =
17b60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17b70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17b80 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
17b90 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20  rOpen, iSorter, 
17ba0 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  0, pIndex->nKeyC
17bb0 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20  ol, (char*).    
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bd0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
17be0 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49  f(pKey), P4_KEYI
17bf0 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  NFO);..  /* Open
17c00 20 74 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70   the table. Loop
17c10 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77   through all row
17c20 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20  s of the table, 
17c30 69 6e 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a  inserting index.
17c40 20 20 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74    ** records int
17c50 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  o the sorter. */
17c60 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61  .  sqlite3OpenTa
17c70 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
17c80 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
17c90 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64  OpenRead);.  add
17ca0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
17cb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
17cc0 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56  ind, iTab, 0); V
17cd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17ce0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
17cf0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
17d00 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
17d10 65 33 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61  e3MultiWrite(pPa
17d20 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
17d30 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
17d40 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
17d50 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
17d60 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
17d70 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
17d80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
17d90 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
17da0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
17db0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
17dc0 76 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70  vePartIdxLabel(p
17dd0 50 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c  Parse, iPartIdxL
17de0 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
17df0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17e00 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
17e10 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
17e20 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
17e30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17e40 20 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d   addr1);.  if( m
17e50 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73  emRootPage<0 ) s
17e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17e70 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e  (v, OP_Clear, tn
17e80 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  um, iDb);.  sqli
17e90 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
17ea0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69   OP_OpenWrite, i
17eb0 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20  Idx, tnum, iDb, 
17ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ed0 20 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65       (char *)pKe
17ee0 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  y, P4_KEYINFO);.
17ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17f00 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
17f10 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f  BULKCSR|((memRoo
17f20 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47  tPage>=0)?OPFLAG
17f30 5f 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20  _P2ISREG:0));.. 
17f40 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
17f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17f60 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f  _SorterSort, iSo
17f70 72 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f  rter, 0); VdbeCo
17f80 76 65 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28  verage(v);.  if(
17f90 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
17fa0 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e  Index) ){.    in
17fb0 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
17fc0 62 65 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20  beGoto(v, 1);.  
17fd0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
17fe0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17ff0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
18000 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 61  VdbeVerifyAborta
18010 62 6c 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29  ble(v, OE_Abort)
18020 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18030 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18040 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20  _SorterCompare, 
18050 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67  iSorter, j2, reg
18060 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20  Record,.        
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
18090 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
180a0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55  v);.    sqlite3U
180b0 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
180c0 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
180d0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  , pIndex);.    s
180e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
180f0 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c  re(v, j2);.  }el
18100 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  se{.    addr2 = 
18110 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
18120 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20  ntAddr(v);.  }. 
18130 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18140 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
18150 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ata, iSorter, re
18160 67 52 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a  gRecord, iIdx);.
18170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18180 4f 70 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e  Op1(v, OP_SeekEn
18190 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
181a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
181b0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
181c0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
181d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
181e0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
181f0 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
18200 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
18210 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18220 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
18230 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18240 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
18250 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72  t, iSorter, addr
18260 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  2); VdbeCoverage
18270 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
18280 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
18290 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  dr1);..  sqlite3
182a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
182b0 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20  _Close, iTab);. 
182c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182d0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
182e0 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
182f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
18300 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29  _Close, iSorter)
18310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
18320 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20 74  ate heap space t
18330 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20  o hold an Index 
18340 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c  object with nCol
18350 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20   columns..**.** 
18360 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  Increase the all
18370 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20  ocation size to 
18380 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61  provide an extra
18390 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
183a0 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
183b0 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20 74  ed space after t
183c0 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  he Index object 
183d0 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20  and return a.** 
183e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
183f0 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a  extra space in *
18400 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65  ppExtra..*/.Inde
18410 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61  x *sqlite3Alloca
18420 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20  teIndexObject(. 
18430 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
18440 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18450 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
18460 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20    i16 nCol,     
18470 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
18480 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
18490 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
184a0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
184b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
184c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65  er of bytes of e
184d0 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c  xtra space to al
184e0 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  loc */.  char **
184f0 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a  ppExtra       /*
18500 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
18510 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f  "extra" space */
18520 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20  .){.  Index *p; 
18530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
18540 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62  located index ob
18550 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ject */.  int nB
18560 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  yte;           /
18570 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
18580 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63   for Index objec
18590 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20  t + arrays */.. 
185a0 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
185b0 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b  sizeof(Index)) +
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185d0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
185e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
185f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
18600 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20  r*)*nCol) +     
18610 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43      /* Index.azC
18620 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  oll     */.     
18630 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65       ROUND8(size
18640 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
18650 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64  +1) +     /* Ind
18660 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20  ex.aiRowLogEst  
18670 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
18680 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29       sizeof(i16)
18690 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20  *nCol +         
186a0 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
186b0 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20  lumn   */.      
186c0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
186d0 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20  f(u8)*nCol);    
186e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
186f0 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
18700 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
18710 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
18720 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20  yte + nExtra);. 
18730 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68   if( p ){.    ch
18740 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63  ar *pExtra = ((c
18750 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73  har*)p)+ROUND8(s
18760 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
18770 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28     p->azColl = (
18780 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78  const char**)pEx
18790 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52  tra; pExtra += R
187a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61  OUND8(sizeof(cha
187b0 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70  r*)*nCol);.    p
187c0 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20  ->aiRowLogEst = 
187d0 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b  (LogEst*)pExtra;
187e0 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   pExtra += sizeo
187f0 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b  f(LogEst)*(nCol+
18800 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c  1);.    p->aiCol
18810 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74  umn = (i16*)pExt
18820 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
18830 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
18840 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f  nCol;.    p->aSo
18850 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70  rtOrder = (u8*)p
18860 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43  Extra;.    p->nC
18870 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20  olumn = nCol;.  
18880 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e    p->nKeyCol = n
18890 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70  Col - 1;.    *pp
188a0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
188b0 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  p) + nByte;.  }.
188c0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
188d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
188e0 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
188f0 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
18900 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
18910 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
18920 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
18930 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
18940 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
18950 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
18960 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
18970 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
18980 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
18990 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
189a0 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
189b0 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
189c0 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
189d0 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
189e0 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
189f0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
18a00 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
18a10 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
18a20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
18a30 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
18a40 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
18a50 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
18a60 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
18a70 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
18a80 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
18a90 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
18aa0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
18ab0 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
18ac0 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
18ad0 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
18ae0 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
18af0 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
18b00 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
18b10 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
18b20 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
18b30 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18b40 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
18b50 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
18b60 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
18b70 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
18b80 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
18b90 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
18ba0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
18bb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
18bc0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
18bd0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
18be0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
18bf0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
18c00 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
18c10 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
18c20 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
18c30 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
18c40 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
18c50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
18c60 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
18c70 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
18c80 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
18c90 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
18ca0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
18cb0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
18cc0 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
18cd0 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
18ce0 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
18cf0 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
18d00 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
18d10 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
18d20 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
18d30 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72  .  Expr *pPIWher
18d40 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63  e,    /* WHERE c
18d50 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61  lause for partia
18d60 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
18d70 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
18d80 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
18d90 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
18da0 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
18db0 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
18dc0 69 73 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist,    /* Omit 
18dd0 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
18de0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
18df0 0a 20 20 75 38 20 69 64 78 54 79 70 65 20 20 20  .  u8 idxType   
18e00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
18e10 65 78 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  ex type */.){.  
18e20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
18e30 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18e40 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
18e50 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d   Index *pIndex =
18e60 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64   0;   /* The ind
18e70 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ex to be created
18e80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
18e90 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61  e = 0;     /* Na
18ea0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
18eb0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
18ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18ed0 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
18ee0 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20  s in zName */.  
18ef0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69  int i, j;.  DbFi
18f00 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20  xer sFix;       
18f10 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e   /* For assignin
18f20 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73  g database names
18f30 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20   to pTable */.  
18f40 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  int sortOrderMas
18f50 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e  k;   /* 1 to hon
18f60 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78  or DESC in index
18f70 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20  .  0 to ignore. 
18f80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
18f90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
18fa0 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
18fb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
18fc0 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74  cific table cont
18fd0 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  aining the index
18fe0 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ed database */. 
18ff0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
19000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19010 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
19020 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69  hat is being wri
19030 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tten */.  Token 
19040 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f  *pName = 0;    /
19050 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
19060 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
19070 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73  to create */.  s
19080 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
19090 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20  tem *pListItem; 
190a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
190b0 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69  ver pList */.  i
190c0 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20  nt nExtra = 0;  
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
190f0 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20  ed for zExtra[] 
19100 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43  */.  int nExtraC
19110 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
19120 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19130 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73  of extra columns
19140 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61   needed */.  cha
19150 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20  r *zExtra = 0;  
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19170 20 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74   Extra space aft
19180 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  er the Index obj
19190 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ect */.  Index *
191a0 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  pPk = 0;      /*
191b0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
191c0 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ex for WITHOUT R
191d0 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a  OWID tables */..
191e0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
191f0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
19200 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
19210 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19220 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
19230 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  ( IN_DECLARE_VTA
19240 42 20 26 26 20 69 64 78 54 79 70 65 21 3d 53 51  B && idxType!=SQ
19250 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
19260 4d 41 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67  MARYKEY ){.    g
19270 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19280 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
19290 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
192a0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
192b0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
192c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
192d0 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
192e0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
192f0 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
19300 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
19310 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
19320 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
19330 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
19340 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
19350 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
19360 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
19370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
19380 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
19390 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
193a0 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
193b0 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
193c0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
193d0 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
193e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
193f0 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
19400 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
19410 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
19420 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
19430 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
19440 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
19450 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
19460 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19470 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
19480 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
19490 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
194a0 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
194b0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
194c0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
194d0 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
194e0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
194f0 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
19500 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
19510 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
19520 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
19530 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
19540 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
19550 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
19560 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
19570 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
19580 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
19590 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
195a0 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
195b0 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
195c0 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
195d0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
195e0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
195f0 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
19600 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
19610 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
19620 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
19630 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
19640 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
19650 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  me);.    if( sql
19660 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
19670 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20  sFix, pTblName) 
19680 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
19690 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
196a0 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
196b0 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
196c0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
196d0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
196e0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
196f0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
19700 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
19710 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
19720 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
19730 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
19740 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
19750 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
19760 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
19770 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
19780 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
19790 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
197a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
197b0 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
197c0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
197d0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
197e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
197f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
19800 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
19810 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
19820 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
19830 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
19840 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
19850 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
19860 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19870 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19880 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
19890 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20  d(pTab) ) pPk = 
198a0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
198b0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
198c0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
198d0 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
198e0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
198f0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  t==0 );.    pTab
19900 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
19910 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
19920 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
19930 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19940 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
19950 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
19960 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
19970 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
19980 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
19990 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
199a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
199b0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
199c0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
199d0 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
199e0 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
199f0 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 64 62  =0 .       && db
19a00 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23  ->init.busy==0.#
19a10 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
19a20 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
19a30 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 55       && sqlite3U
19a40 73 65 72 41 75 74 68 54 61 62 6c 65 28 70 54 61  serAuthTable(pTa
19a50 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e  b->zName)==0.#en
19a60 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
19a70 45 5f 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d  E_ALLOW_SQLITE_M
19a80 41 53 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20  ASTER_INDEX.    
19a90 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72     && sqlite3Str
19aa0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
19ab0 65 5b 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d  e[7],"master")!=
19ac0 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  0.#endif.       
19ad0 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
19ae0 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b  mp(&pTab->zName[
19af0 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39  7],"altertab_",9
19b00 29 21 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71 6c  )!=0. ){.    sql
19b10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19b20 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
19b30 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
19b40 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
19b50 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
19b60 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19b70 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19b80 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
19b90 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
19ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
19bb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
19bc0 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
19bd0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
19be0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19bf0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
19c00 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
19c10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19c20 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
19c30 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
19c40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
19c50 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
19c60 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
19c70 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
19c80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19c90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
19ca0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
19cb0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
19cc0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
19cd0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
19ce0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
19cf0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
19d00 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
19d10 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
19d20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
19d30 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
19d40 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
19d50 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
19d60 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
19d70 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
19d80 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
19d90 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
19da0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
19db0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
19dc0 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
19dd0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
19de0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
19df0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
19e00 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
19e10 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
19e20 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
19e30 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
19e40 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
19e50 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
19e60 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
19e70 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
19e80 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
19e90 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
19ea0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
19eb0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
19ec0 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
19ed0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
19ee0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
19ef0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
19f00 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
19f10 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
19f20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19f30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
19f40 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
19f50 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
19f60 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
19f70 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
19f80 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
19f90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19fa0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19fb0 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f   if( !IN_RENAME_
19fc0 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
19fd0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
19fe0 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  sy ){.        if
19ff0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
1a000 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
1a010 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1a020 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a030 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
1a040 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
1a050 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
1a060 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1a070 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1a080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  _index;.        
1a090 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a0a0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
1a0b0 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
1a0c0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d  pDb->zDbSName)!=
1a0d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1a0e0 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
1a0f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a100 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1a110 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65  , "index %s alre
1a120 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61  ady exists", zNa
1a130 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  me);.        }el
1a140 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
1a150 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
1a160 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
1a170 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1a180 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1a190 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
1a1a0 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
1a1b0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1a1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1a1e0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
1a1f0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
1a200 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
1a210 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
1a220 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
1a230 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
1a240 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
1a250 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
1a260 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
1a270 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
1a280 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
1a290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
1a2a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a2b0 64 65 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dex;.    }..    
1a2c0 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64  /* Automatic ind
1a2d0 65 78 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74  ex names generat
1a2e0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73  ed from within s
1a2f0 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
1a300 74 61 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73  tab().    ** mus
1a310 74 20 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61  t have names tha
1a320 74 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 66  t are distinct f
1a330 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d  rom normal autom
1a340 61 74 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73  atic index names
1a350 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ..    ** The fol
1a360 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
1a370 20 63 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74   converts "sqlit
1a380 65 33 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22  e3_autoindex..."
1a390 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71   into.    ** "sq
1a3a0 6c 69 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e  lite3_butoindex.
1a3b0 2e 2e 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .." in order to 
1a3c0 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64  make the names d
1a3d0 69 73 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20  istinct..    ** 
1a3e0 54 68 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65  The "vtab_err.te
1a3f0 73 74 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74  st" test demonst
1a400 72 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f  rates the need o
1a410 66 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  f this statement
1a420 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f  . */.    if( IN_
1a430 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 20  SPECIAL_PARSE ) 
1a440 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a  zName[7]++;.  }.
1a450 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1a460 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f  authorization to
1a470 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78   create an index
1a480 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
1a490 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1a4a0 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 21  RIZATION.  if( !
1a4b0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1a4c0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1a4d0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
1a4e0 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  DbSName;.    if(
1a4f0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a500 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a510 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
1a520 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a  TABLE(iDb), 0, z
1a530 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1a540 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a550 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
1a560 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
1a570 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
1a580 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1a590 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c  iDb==1 ) i = SQL
1a5a0 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
1a5b0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73  INDEX;.    if( s
1a5c0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1a5d0 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65  pParse, i, zName
1a5e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1a5f0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1a600 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1a610 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  dex;.    }.  }.#
1a620 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
1a630 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e  List==0, it mean
1a640 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1a650 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b  as called to mak
1a660 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a  e a primary.  **
1a670 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20   key out of the 
1a680 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  last column adde
1a690 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75  d to the table u
1a6a0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a6b0 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74  n..  ** So creat
1a6c0 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f  e a fake list to
1a6d0 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a   simulate this..
1a6e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74    */.  if( pList
1a6f0 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ==0 ){.    Token
1a700 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f   prevCol;.    Co
1a710 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54  lumn *pCol = &pT
1a720 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
1a730 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c  Col-1];.    pCol
1a740 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
1a750 4c 46 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20  LFLAG_UNIQUE;.  
1a760 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e    sqlite3TokenIn
1a770 69 74 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f  it(&prevCol, pCo
1a780 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  l->zName);.    p
1a790 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
1a7a0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1a7b0 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
1a7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a7d0 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44  rAlloc(db, TK_ID
1a7e0 2c 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b  , &prevCol, 0));
1a7f0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
1a800 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
1a810 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1a820 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
1a830 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73  Expr==1 );.    s
1a840 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
1a850 74 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74  tSortOrder(pList
1a860 2c 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20  , sortOrder);.  
1a870 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1a880 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
1a890 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c  ength(pParse, pL
1a8a0 69 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20  ist, "index");. 
1a8b0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
1a8c0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74  out how many byt
1a8d0 65 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20  es of space are 
1a8e0 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
1a8f0 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a  e explicitly.  *
1a900 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c  * specified coll
1a910 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1a920 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ames..  */.  for
1a930 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1a940 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a950 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
1a960 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
1a970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
1a980 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pr!=0 );.    if(
1a990 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1a9a0 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20  OLLATE ){.      
1a9b0 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
1a9c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
1a9d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29  Expr->u.zToken))
1a9e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a9f0 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  * .  ** Allocate
1aa00 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
1aa10 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e  ture. .  */.  nN
1aa20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1aa30 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
1aa40 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20  nExtraCol = pPk 
1aa50 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a  ? pPk->nKeyCol :
1aa60 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73   1;.  pIndex = s
1aa70 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
1aa80 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c  dexObject(db, pL
1aa90 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78  ist->nExpr + nEx
1aaa0 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  traCol,.        
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e                nN
1aad0 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31  ame + nExtra + 1
1aae0 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66  , &zExtra);.  if
1aaf0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ab00 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
1ab10 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1ab20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ab30 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1ab40 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52  MENT(pIndex->aiR
1ab50 6f 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61  owLogEst) );.  a
1ab60 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1ab70 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
1ab80 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
1ab90 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
1aba0 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72   zExtra;.  zExtr
1abb0 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  a += nName + 1;.
1abc0 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
1abd0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
1abe0 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
1abf0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
1ac00 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
1ac10 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
1ac20 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
1ac30 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
1ac40 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70  or!=OE_None;.  p
1ac50 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d  Index->idxType =
1ac60 20 69 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64   idxType;.  pInd
1ac70 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
1ac80 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1ac90 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b  ma;.  pIndex->nK
1aca0 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e  eyCol = pList->n
1acb0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57  Expr;.  if( pPIW
1acc0 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
1acd0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
1ace0 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
1acf0 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78  pTab, NC_PartIdx
1ad00 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a  , pPIWhere, 0);.
1ad10 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72      pIndex->pPar
1ad20 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57  tIdxWhere = pPIW
1ad30 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65  here;.    pPIWhe
1ad40 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  re = 0;.  }.  as
1ad50 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1ad60 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1ad70 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f   iDb, 0) );..  /
1ad80 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1ad90 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f  f we should hono
1ada0 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20  r DESC requests 
1adb0 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  on index columns
1adc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d  .  */.  if( pDb-
1add0 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
1ade0 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
1adf0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
1ae00 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44  -1;   /* Honor D
1ae10 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ESC */.  }else{.
1ae20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
1ae30 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e  k = 0;    /* Ign
1ae40 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a  ore DESC */.  }.
1ae50 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68  .  /* Analyze th
1ae60 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
1ae70 73 69 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  sions that form 
1ae80 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1ae90 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20   index and.  ** 
1aea0 72 65 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72  report any error
1aeb0 73 2e 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f  s.  In the commo
1aec0 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
1aed0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
1aee0 78 61 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61  xactly.  ** a ta
1aef0 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72  ble column, stor
1af00 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e  e that column in
1af10 20 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f   aiColumn[].  Fo
1af20 72 20 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73  r general expres
1af30 73 69 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75  sions,.  ** popu
1af40 6c 61 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f  late pIndex->aCo
1af50 6c 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  lExpr and store 
1af60 58 4e 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20  XN_EXPR (-2) in 
1af70 61 69 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a  aiColumn[]..  **
1af80 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75  .  ** TODO: Issu
1af90 65 20 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74  e a warning if t
1afa0 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d  wo or more colum
1afb0 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ns of the index 
1afc0 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20  are identical.. 
1afd0 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20   ** TODO: Issue 
1afe0 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65  a warning if the
1aff0 20 74 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b   table primary k
1b000 65 79 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ey is used as pa
1b010 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69  rt of the.  ** i
1b020 6e 64 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20  ndex key..  */. 
1b030 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c 69   pListItem = pLi
1b040 73 74 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f  st->a;.  if( IN_
1b050 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
1b060 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f  .    pIndex->aCo
1b070 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20  lExpr = pList;. 
1b080 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
1b090 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1b0a0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  Index->nKeyCol; 
1b0b0 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
1b0c0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45  ){.    Expr *pCE
1b0d0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
1b0e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74        /* The i-t
1b0f0 68 20 69 6e 64 65 78 20 65 78 70 72 65 73 73 69  h index expressi
1b100 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  on */.    int re
1b110 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1b120 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20  ;        /* ASC 
1b130 6f 72 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69  or DESC on the i
1b140 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
1b150 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
1b160 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
1b170 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
1b180 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
1b190 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53  */..    sqlite3S
1b1a0 74 72 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49  tringToId(pListI
1b1b0 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
1b1c0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
1b1d0 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
1b1e0 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64  rse, pTab, NC_Id
1b1f0 78 45 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d  xExpr, pListItem
1b200 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ->pExpr, 0);.   
1b210 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1b220 72 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  r ) goto exit_cr
1b230 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1b240 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
1b250 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
1b260 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1b270 29 3b 0a 20 20 20 20 69 66 28 20 70 43 45 78 70  );.    if( pCExp
1b280 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
1b290 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54   ){.      if( pT
1b2a0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
1b2b0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
1b2c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b2d0 28 70 50 61 72 73 65 2c 20 22 65 78 70 72 65 73  (pParse, "expres
1b2e0 73 69 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64  sions prohibited
1b2f0 20 69 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20   in PRIMARY KEY 
1b300 61 6e 64 20 22 0a 20 20 20 20 20 20 20 20 20 20  and ".          
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 20 20 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f        "UNIQUE co
1b330 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20  nstraints");.   
1b340 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
1b350 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
1b360 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1b370 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d  Index->aColExpr=
1b380 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
1b390 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
1b3a0 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
1b3b0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
1b3c0 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f   }.      j = XN_
1b3d0 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
1b3e0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1b3f0 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20  = XN_EXPR;.     
1b400 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
1b410 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Null = 0;.    }e
1b420 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70  lse{.      j = p
1b430 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  CExpr->iColumn;.
1b440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
1b450 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20  =0x7fff );.     
1b460 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20   if( j<0 ){.    
1b470 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50      j = pTab->iP
1b480 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
1b490 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
1b4a0 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  j].notNull==0 ){
1b4b0 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1b4c0 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
1b4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b4e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b4f0 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20  [i] = (i16)j;.  
1b500 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20    }.    zColl = 
1b510 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  0;.    if( pList
1b520 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Item->pExpr->op=
1b530 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
1b540 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
1b550 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
1b560 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
1b570 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
1b580 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
1b590 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
1b5a0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1b5b0 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
1b5c0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1b5d0 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
1b5e0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
1b5f0 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
1b600 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
1b610 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
1b620 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
1b630 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b  else if( j>=0 ){
1b640 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1b650 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
1b660 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
1b670 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c  ( !zColl ) zColl
1b680 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
1b690 41 52 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62  ARY;.    if( !db
1b6a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
1b6b0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
1b6c0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
1b6d0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
1b6e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1b6f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
1b700 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1b710 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
1b720 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
1b730 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
1b740 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
1b750 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
1b760 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1b770 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
1b780 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
1b790 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1b7a0 65 20 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74  e table key to t
1b7b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1b7c0 64 65 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55  dex.  For WITHOU
1b7d0 54 20 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62  T ROWID.  ** tab
1b7e0 6c 65 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30  les (when pPk!=0
1b7f0 29 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  ) this will be t
1b800 68 65 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d  he declared PRIM
1b810 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20  ARY KEY.  For.  
1b820 2a 2a 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73  ** normal tables
1b830 20 28 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74   (when pPk==0) t
1b840 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1b850 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  rowid..  */.  if
1b860 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72  ( pPk ){.    for
1b870 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
1b880 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
1b890 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61    int x = pPk->a
1b8a0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
1b8b0 20 20 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29    assert( x>=0 )
1b8c0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  ;.      if( hasC
1b8d0 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69  olumn(pIndex->ai
1b8e0 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e  Column, pIndex->
1b8f0 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20  nKeyCol, x) ){. 
1b900 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
1b910 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20  Column--; .     
1b920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b930 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1b940 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  [i] = x;.       
1b950 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1b960 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  i] = pPk->azColl
1b970 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  [j];.        pIn
1b980 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
1b990 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f  i] = pPk->aSortO
1b9a0 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
1b9b0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
1b9c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1b9d0 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  i==pIndex->nColu
1b9e0 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mn );.  }else{. 
1b9f0 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
1ba00 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49  umn[i] = XN_ROWI
1ba10 44 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  D;.    pIndex->a
1ba20 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  zColl[i] = sqlit
1ba30 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1ba40 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
1ba50 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
1ba60 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
1ba70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73  NewTable==0 ) es
1ba80 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
1ba90 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20  (pIndex);..  /* 
1baa0 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f  If this index co
1bab0 6e 74 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c  ntains every col
1bac0 75 6d 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65  umn of its table
1bad0 2c 20 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a  , then mark.  **
1bae0 20 69 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e   it as a coverin
1baf0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73  g index */.  ass
1bb00 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 54  ert( HasRowid(pT
1bb10 61 62 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54  ab) .      || pT
1bb20 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73  ab->iPKey<0 || s
1bb30 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
1bb40 64 65 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62  dex(pIndex, pTab
1bb50 2d 3e 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20  ->iPKey)>=0 );. 
1bb60 20 72 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e   recomputeColumn
1bb70 73 4e 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64  sNotIndexed(pInd
1bb80 65 78 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e  ex);.  if( pTblN
1bb90 61 6d 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78  ame!=0 && pIndex
1bba0 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d  ->nColumn>=pTab-
1bbb0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e  >nCol ){.    pIn
1bbc0 64 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20  dex->isCovering 
1bbd0 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 1;.    for(j=0
1bbe0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1bbf0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
1bc00 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29  j==pTab->iPKey )
1bc10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bc20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75   if( sqlite3Colu
1bc30 6d 6e 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78  mnOfIndex(pIndex
1bc40 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ,j)>=0 ) continu
1bc50 65 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  e;.      pIndex-
1bc60 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b  >isCovering = 0;
1bc70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bc80 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1bc90 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1bca0 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
1bcb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
1bcc0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
1bcd0 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
1bce0 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
1bcf0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
1bd00 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1bd10 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1bd20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
1bd30 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
1bd40 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
1bd50 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1bd60 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
1bd70 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1bd80 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
1bd90 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
1bda0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1bdb0 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
1bdc0 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
1bdd0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
1bde0 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
1bdf0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1be00 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
1be10 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1be20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
1be30 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
1be40 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
1be50 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
1be60 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
1be70 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
1be80 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
1be90 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1bea0 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
1beb0 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
1bec0 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
1bed0 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
1bee0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bef0 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
1bf00 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1bf10 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
1bf20 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
1bf30 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
1bf40 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
1bf50 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
1bf60 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
1bf70 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
1bf80 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
1bf90 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1bfa0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1bfb0 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1bfc0 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
1bfd0 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
1bfe0 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
1bff0 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
1c000 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
1c010 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1c020 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
1c030 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1c040 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
1c050 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
1c060 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
1c070 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1c080 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1c090 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
1c0a0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
1c0b0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1c0c0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1c0d0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1c0e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c0f0 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
1c100 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1c110 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
1c120 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1c130 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
1c140 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1c150 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
1c160 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
1c170 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
1c180 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
1c190 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
1c1a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c1b0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1c1c0 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1c1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1c1e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30  ->aiColumn[k]>=0
1c1f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1c200 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1c210 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
1c220 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
1c230 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
1c240 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1c250 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
1c260 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1c270 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1c280 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29  3StrICmp(z1, z2)
1c290 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c2a0 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70  }.      if( k==p
1c2b0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a  Idx->nKeyCol ){.
1c2c0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1c2d0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65  ->onError!=pInde
1c2e0 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20  x->onError ){.  
1c2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1c300 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74  constraint creat
1c310 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  es the same inde
1c320 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a  x as a previous.
1c330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
1c340 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69 65  straint specifie
1c350 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74  d somewhere in t
1c360 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
1c370 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
1c380 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20       ** However 
1c390 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  the ON CONFLICT 
1c3a0 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66 66  clauses are diff
1c3b0 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74  erent. If both t
1c3c0 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
1c3d0 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  * constraint and
1c3e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 71   the previous eq
1c3f0 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61  uivalent constra
1c400 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63 69  int have explici
1c410 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f  t.          ** O
1c420 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
1c430 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65 72  es this is an er
1c440 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ror. Otherwise, 
1c450 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  use the.        
1c460 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20    ** explicitly 
1c470 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76 69  specified behavi
1c480 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
1c490 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1c4a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1c4b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1c4c0 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64  _Default || pInd
1c4d0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1c4e0 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20  Default) ){.    
1c4f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1c500 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c520 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e   "conflicting ON
1c530 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1c540 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30 29  s specified", 0)
1c550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c560 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
1c570 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1c580 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
1c590 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72       pIdx->onErr
1c5a0 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45  or = pIndex->onE
1c5b0 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
1c5c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1c5d0 20 20 20 20 69 66 28 20 69 64 78 54 79 70 65 3d      if( idxType=
1c5e0 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
1c5f0 50 52 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64  PRIMARYKEY ) pId
1c600 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78  x->idxType = idx
1c610 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Type;.        if
1c620 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
1c630 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CT ){.          
1c640 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1c650 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1c660 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  x;.          pPa
1c670 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d  rse->pNewIndex =
1c680 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20   pIndex;.       
1c690 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20     pIndex = 0;. 
1c6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c6b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c6c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1c6d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1c6e0 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
1c6f0 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c  ECT ){..    /* L
1c700 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
1c710 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
1c720 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
1c730 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  the other.    **
1c740 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1c750 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
1c760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1c770 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
1c780 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ==0 );.    if( d
1c790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1c7a0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a        Index *p;.
1c7b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 49        assert( !I
1c7c0 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20  N_SPECIAL_PARSE 
1c7d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c7e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1c7f0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
1c800 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
1c810 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 73 71 6c  );.      p = sql
1c820 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1c830 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1c840 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1c850 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1c860 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1c870 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1c880 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1c890 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c  Index );  /* Mal
1c8a0 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1c8b0 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
1c8c0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1c8d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  db);.        got
1c8e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1c8f0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
1c900 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20     db->mDbFlags 
1c910 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61  |= DBFLAG_Schema
1c920 43 68 61 6e 67 65 3b 0a 20 20 20 20 20 20 69 66  Change;.      if
1c930 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
1c940 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1c950 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
1c960 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20  .newTnum;.      
1c970 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
1c980 65 78 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f  exHasDuplicateRo
1c990 6f 74 50 61 67 65 28 70 49 6e 64 65 78 29 20 29  otPage(pIndex) )
1c9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1c9b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c9c0 73 65 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f  se, "invalid roo
1c9d0 74 20 70 61 67 65 22 29 3b 0a 20 20 20 20 20 20  t page");.      
1c9e0 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1c9f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ca00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1ca10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1ca20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  _index;.        
1ca30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ca40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1ca50 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43  is the initial C
1ca60 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
1ca70 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45  ement (or CREATE
1ca80 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20   TABLE if the.  
1ca90 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e    ** index is an
1caa0 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66   implied index f
1cab0 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50  or a UNIQUE or P
1cac0 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1cad0 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 20 20  raint) then.    
1cae0 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20  ** emit code to 
1caf0 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  allocate the ind
1cb00 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64  ex rootpage on d
1cb10 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20  isk and make an 
1cb20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 2a 2a  entry for.    **
1cb30 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
1cb40 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1cb50 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61  table and popula
1cb60 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  te the index wit
1cb70 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  h.    ** content
1cb80 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64  .  But, do not d
1cb90 6f 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65  o this if we are
1cba0 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20   simply reading 
1cbb0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1cbc0 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74  r.    ** table t
1cbd0 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
1cbe0 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
1cbf0 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
1cc00 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
1cc10 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55    ** of a WITHOU
1cc20 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20  T ROWID table.. 
1cc30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1cc40 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
1cc50 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
1cc60 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
1cc70 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41  an implied PRIMA
1cc80 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20 6f 72  RY KEY.    ** or
1cc90 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e   UNIQUE index in
1cca0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1ccb0 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
1ccc0 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  e the table.    
1ccd0 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
1cce0 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
1ccf0 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
1cd00 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
1cd10 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  ialization.    *
1cd20 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
1cd30 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
1cd40 20 20 65 6c 73 65 20 69 66 28 20 48 61 73 52 6f    else if( HasRo
1cd50 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62  wid(pTab) || pTb
1cd60 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
1cd70 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20    Vdbe *v;.     
1cd80 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
1cd90 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
1cda0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
1cdb0 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65        v = sqlite
1cdc0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1cdd0 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30  ;.      if( v==0
1cde0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1cdf0 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
1ce00 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1ce10 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1ce20 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20  rse, 1, iDb);.. 
1ce30 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
1ce40 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
1ce50 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20  the index using 
1ce60 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74  CreateIndex. But
1ce70 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
1ce80 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20   doing so, code 
1ce90 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63 74 69  a Noop instructi
1cea0 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69 74 73  on and store its
1ceb0 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20 20 20   address in .   
1cec0 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e 75 6d     ** Index.tnum
1ced0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1cee0 65 64 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ed in case this 
1cef0 69 6e 64 65 78 20 69 73 20 61 63 74 75 61 6c 6c  index is actuall
1cf00 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 50 52  y a .      ** PR
1cf10 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 74 68  IMARY KEY and th
1cf20 65 20 74 61 62 6c 65 20 69 73 20 61 63 74 75 61  e table is actua
1cf30 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20 52 4f  lly a WITHOUT RO
1cf40 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20 0a 20  WID table. In . 
1cf50 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 73       ** that cas
1cf60 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f 57  e the convertToW
1cf70 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
1cf80 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
1cf90 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20 2a 2a  replace.      **
1cfa0 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61   the Noop with a
1cfb0 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76   Goto to jump ov
1cfc0 65 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65  er the VDBE code
1cfd0 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77   generated below
1cfe0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e 64 65  . */.      pInde
1cff0 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65  x->tnum = sqlite
1d000 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1d010 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73  P_Noop);.      s
1d020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1d030 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42 74 72  (v, OP_CreateBtr
1d040 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c 20 42  ee, iDb, iMem, B
1d050 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 0a  TREE_BLOBKEY);..
1d060 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20        /* Gather 
1d070 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1d080 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
1d090 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1d0a0 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  into.      ** th
1d0b0 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
1d0c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d0d0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
1d0e0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69        int n = (i
1d0f0 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73  nt)(pParse->sLas
1d100 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65  tToken.z - pName
1d110 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73  ->z) + pParse->s
1d120 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  LastToken.n;.   
1d130 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e       if( pName->
1d140 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d  z[n-1]==';' ) n-
1d150 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  -;.        /* A 
1d160 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
1d170 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
1d180 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1d190 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ent */.        z
1d1a0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
1d1b0 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54  rintf(db, "CREAT
1d1c0 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c  E%s INDEX %.*s",
1d1d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 45  .            onE
1d1e0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
1d1f0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20  "" : " UNIQUE", 
1d200 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  n, pName->z);.  
1d210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d220 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
1d230 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
1d240 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
1d250 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
1d260 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
1d270 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c    /* zStmt = sql
1d280 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b  ite3MPrintf("");
1d290 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 53 74 6d   */.        zStm
1d2a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  t = 0;.      }..
1d2b0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20        /* Add an 
1d2c0 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
1d2d0 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
1d2e0 69 6e 64 65 78 0a 20 20 20 20 20 20 2a 2f 0a 20  index.      */. 
1d2f0 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74       sqlite3Nest
1d300 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
1d310 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45  .          "INSE
1d320 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
1d330 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
1d340 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
1d350 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
1d360 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d  iDb].zDbSName, M
1d370 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20  ASTER_NAME,.    
1d380 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1d390 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ame,.          p
1d3a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
1d3b0 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20        iMem,.    
1d3c0 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20        zStmt.    
1d3d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
1d3e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d3f0 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 20 20   zStmt);..      
1d400 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
1d410 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
1d420 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
1d430 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
1d440 78 70 69 72 65 0a 20 20 20 20 20 20 2a 2a 20 74  xpire.      ** t
1d450 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
1d460 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
1d470 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 20  atements..      
1d480 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 54 62  */.      if( pTb
1d490 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  lName ){.       
1d4a0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1d4b0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1d4c0 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1d4d0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1d4e0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1d4f0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1d500 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1d510 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
1d520 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d530 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1d540 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  "name='%q' AND t
1d550 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49  ype='index'", pI
1d560 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ndex->zName));. 
1d570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 45  beAddOp2(v, OP_E
1d590 78 70 69 72 65 2c 20 30 2c 20 31 29 3b 0a 20 20  xpire, 0, 1);.  
1d5a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
1d5b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1d5c0 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  (v, pIndex->tnum
1d5d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d5e0 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61  /* When adding a
1d5f0 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  n index to the l
1d600 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66  ist of indices f
1d610 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65  or a table, make
1d620 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69  .  ** sure all i
1d630 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f  ndices labeled O
1d640 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61  E_Replace come a
1d650 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c  fter all those l
1d660 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49  abeled.  ** OE_I
1d670 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20  gnore.  This is 
1d680 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68  necessary for th
1d690 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72  e correct constr
1d6a0 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20  aint check.  ** 
1d6b0 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73  processing (in s
1d6c0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f  qlite3GenerateCo
1d6d0 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29  nstraintChecks()
1d6e0 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a  ) as part of.  *
1d6f0 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53  * UPDATE and INS
1d700 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ERT statements. 
1d710 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
1d720 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
1d730 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
1d740 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
1d750 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
1d760 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
1d770 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
1d780 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
1d790 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
1d7a0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1d7b0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1d7c0 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
1d7d0 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
1d7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
1d7f0 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
1d800 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
1d810 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
1d820 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
1d830 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
1d840 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
1d850 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
1d860 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
1d870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
1d880 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
1d890 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1d8a0 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
1d8b0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1d8c0 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1d8d0 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
1d8e0 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
1d8f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1d900 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1d910 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 72  x==0 );.    pPar
1d920 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 3d 20  se->pNewIndex = 
1d930 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64  pIndex;.    pInd
1d940 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
1d950 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
1d960 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
1d970 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
1d980 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 73    if( pIndex ) s
1d990 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 78 28  qlite3FreeIndex(
1d9a0 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73  db, pIndex);.  s
1d9b0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1d9c0 28 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a  (db, pPIWhere);.
1d9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1d9e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1d9f0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  t);.  sqlite3Src
1da00 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1da10 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  TblName);.  sqli
1da20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
1da30 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ame);.}../*.** F
1da40 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
1da50 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
1da60 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
1da70 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
1da80 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
1da90 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
1daa0 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
1dab0 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
1dac0 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
1dad0 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63  is supposed to c
1dae0 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1daf0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1db00 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53   the index..** S
1db10 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b  ince we do not k
1db20 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c  now, guess 1 mil
1db30 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b  lion.  aiRowEst[
1db40 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  1] is an estimat
1db50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  e of the.** numb
1db60 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1db70 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74  e table that mat
1db80 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  ch any particula
1db90 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  r value of the.*
1dba0 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  * first column o
1dbb0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69  f the index.  ai
1dbc0 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20  RowEst[2] is an 
1dbd0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
1dbe0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77  number.** of row
1dbf0 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  s that match any
1dc00 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62   particular comb
1dc10 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ination of the f
1dc20 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
1dc30 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
1dc40 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
1dc50 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
1dc60 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
1dc70 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
1dc80 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
1dc90 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
1dca0 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1dcb0 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
1dcc0 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
1dcd0 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
1dce0 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
1dcf0 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
1dd00 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
1dd10 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
1dd20 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
1dd30 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
1dd40 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
1dd50 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
1dd60 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
1dd70 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
1dd80 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
1dd90 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
1dda0 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20  dx){.  /*       
1ddb0 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c           10,  9,
1ddc0 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20    8,  7,  6 */. 
1ddd0 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d   LogEst aVal[] =
1dde0 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32   { 33, 32, 30, 2
1ddf0 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73  8, 26 };.  LogEs
1de00 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  t *a = pIdx->aiR
1de10 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20  owLogEst;.  int 
1de20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61  nCopy = MIN(Arra
1de30 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64  ySize(aVal), pId
1de40 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69  x->nKeyCol);.  i
1de50 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 6e 64 65  nt i;..  /* Inde
1de60 78 65 73 20 77 69 74 68 20 64 65 66 61 75 6c 74  xes with default
1de70 20 72 6f 77 20 65 73 74 69 6d 61 74 65 73 20 73   row estimates s
1de80 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 73  hould not have s
1de90 74 61 74 31 20 64 61 74 61 20 2a 2f 0a 20 20 61  tat1 data */.  a
1dea0 73 73 65 72 74 28 20 21 70 49 64 78 2d 3e 68 61  ssert( !pIdx->ha
1deb0 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 2f 2a 20  sStat1 );..  /* 
1dec0 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65 6e  Set the first en
1ded0 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72  try (number of r
1dee0 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ows in the index
1def0 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74  ) to the estimat
1df00 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ed .  ** number 
1df10 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1df20 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 20 74 68  able, or half th
1df30 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1df40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a 20 20   in the table.  
1df50 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c  ** for a partial
1df60 20 69 6e 64 65 78 2e 20 20 20 42 75 74 20 64 6f   index.   But do
1df70 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74   not let the est
1df80 69 6d 61 74 65 20 64 72 6f 70 20 62 65 6c 6f 77  imate drop below
1df90 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d   10. */.  a[0] =
1dfa0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1dfb0 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1dfc0 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
1dfd0 68 65 72 65 21 3d 30 20 29 20 61 5b 30 5d 20 2d  here!=0 ) a[0] -
1dfe0 3d 20 31 30 3b 20 20 61 73 73 65 72 74 28 20 31  = 10;  assert( 1
1dff0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
1e000 28 32 29 20 29 3b 0a 20 20 69 66 28 20 61 5b 30  (2) );.  if( a[0
1e010 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1e020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e030 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73     assert( 33==s
1e040 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
1e050 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   );..  /* Estima
1e060 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20  te that a[1] is 
1e070 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61  10, a[2] is 9, a
1e080 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69  [3] is 8, a[4] i
1e090 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a  s 7, a[5] is.  *
1e0a0 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62  * 6 and each sub
1e0b0 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69  sequent value (i
1e0c0 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f  f any) is 5.  */
1e0d0 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c  .  memcpy(&a[1],
1e0e0 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a   aVal, nCopy*siz
1e0f0 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20  eof(LogEst));.  
1e100 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69  for(i=nCopy+1; i
1e110 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  <=pIdx->nKeyCol;
1e120 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i++){.    a[i] 
1e130 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 23;           
1e140 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e150 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   23==sqlite3LogE
1e160 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  st(5) );.  }..  
1e170 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1e180 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
1e190 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
1e1a0 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64  ex(pIdx) ) a[pId
1e1b0 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b  x->nKeyCol] = 0;
1e1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e1d0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
1e1e0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
1e1f0 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
1e200 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
1e210 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
1e220 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
1e230 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1e240 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
1e250 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1e260 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
1e270 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
1e280 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
1e290 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
1e2a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e2b0 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
1e2c0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1e2d0 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
1e2e0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
1e2f0 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
1e300 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1e310 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1e320 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e330 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1e340 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
1e350 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1e360 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1e370 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1e380 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1e390 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1e3a0 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1e3b0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
1e3c0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
1e3d0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1e3e0 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
1e3f0 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
1e400 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
1e410 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1e420 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e430 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1e440 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
1e450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e460 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1e470 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
1e480 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
1e490 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1e4a0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1e4b0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1e4c0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1e4d0 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1e4e0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78   if( pIndex->idx
1e4f0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1e500 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20  TYPE_APPDEF ){. 
1e510 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1e520 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
1e530 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1e540 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
1e550 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
1e560 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
1e570 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
1e580 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
1e590 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1e5a0 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1e5b0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1e5c0 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
1e5d0 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
1e5e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1e5f0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1e600 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1e610 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
1e620 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1e630 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
1e640 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1e650 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1e660 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
1e670 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1e680 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1e690 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1e6a0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1e6b0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1e6c0 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1e6d0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1e6e0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1e6f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1e700 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1e710 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1e720 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1e730 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1e740 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1e750 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1e760 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1e770 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1e780 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1e790 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1e7a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1e7b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1e7c0 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1e7d0 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1e7e0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1e7f0 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1e800 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1e810 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1e820 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1e830 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1e840 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1e850 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1e860 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1e870 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1e880 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1e890 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1e8a0 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1e8b0 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
1e8c0 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c  me, MASTER_NAME,
1e8d0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
1e8e0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1e8f0 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
1e900 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
1e910 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
1e920 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1e930 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1e940 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
1e950 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
1e960 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
1e970 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
1e980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e990 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
1e9a0 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
1e9b0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
1e9c0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
1e9d0 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
1e9e0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1e9f0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
1ea00 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
1ea10 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
1ea20 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
1ea30 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1ea40 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
1ea50 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
1ea60 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
1ea70 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
1ea80 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
1ea90 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
1eaa0 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
1eab0 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1eac0 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
1ead0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
1eae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1eaf0 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
1eb00 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
1eb10 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
1eb20 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
1eb30 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
1eb40 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
1eb50 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
1eb60 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
1eb70 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
1eb80 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1eb90 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
1eba0 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
1ebb0 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
1ebc0 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
1ebd0 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
1ebe0 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
1ebf0 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
1ec00 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
1ec10 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
1ec20 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
1ec30 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
1ec40 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
1ec50 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
1ec60 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1ec70 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1ec80 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
1ec90 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1eca0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ecb0 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
1ecc0 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
1ecd0 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
1ece0 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
1ecf0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
1ed00 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
1ed10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
1ed20 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
1ed30 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
1ed40 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
1ed50 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1ed60 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1ed70 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
1ed80 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
1ed90 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
1eda0 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
1edb0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
1edc0 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
1edd0 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
1ede0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
1edf0 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
1ee00 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
1ee10 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1ee20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1ee30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
1ee40 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1ee50 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1ee60 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
1ee70 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
1ee80 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72   int n = *pnEntr
1ee90 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e  y;.  if( (n & (n
1eea0 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  -1))==0 ){.    i
1eeb0 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  nt sz = (n==0) ?
1eec0 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
1eed0 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
1eee0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1eef0 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
1ef00 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
1ef10 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
1ef20 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
1ef30 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
1ef40 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
1ef50 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
1ef60 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
1ef70 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
1ef80 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
1ef90 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
1efa0 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  = n;.  ++*pnEntr
1efb0 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
1efc0 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
1efd0 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
1efe0 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
1eff0 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
1f000 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
1f010 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
1f020 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
1f030 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1f040 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
1f050 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
1f060 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
1f070 70 65 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pend(Parse *pPar
1f080 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  se, IdList *pLis
1f090 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1f0a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f0b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1f0c0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1f0d0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1f0e0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1f0f0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1f100 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1f110 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1f120 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1f130 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1f140 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1f150 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1f160 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1f170 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1f180 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1f190 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1f1a0 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1f1b0 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1f1c0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1f1d0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1f1e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1f1f0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1f200 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1f210 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1f220 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  en);.  if( IN_RE
1f230 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
1f240 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1f250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
1f260 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50  enameTokenMap(pP
1f270 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 4c 69  arse, (void*)pLi
1f280 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
1f290 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  pToken);.  }.  r
1f2a0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1f2b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1f2c0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1f2d0 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1f2e0 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1f2f0 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1f300 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1f310 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1f320 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1f330 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1f340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1f350 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1f360 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1f370 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f380 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1f390 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
1f3a0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1f3b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f3c0 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20   index in pList 
1f3d0 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  of the identifie
1f3e0 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65  r named zId.  Re
1f3f0 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f  turn -1.** if no
1f400 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  t found..*/.int 
1f410 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1f420 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  ex(IdList *pList
1f430 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1f440 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ame){.  int i;. 
1f450 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1f460 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72  return -1;.  for
1f470 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1f480 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Id; i++){.    if
1f490 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1f4a0 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
1f4b0 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  me, zName)==0 ) 
1f4c0 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1f4d0 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1f4e0 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65  .** Maximum size
1f4f0 20 6f 66 20 61 20 53 72 63 4c 69 73 74 20 6f 62   of a SrcList ob
1f500 6a 65 63 74 2e 0a 2a 2a 20 54 68 65 20 53 72 63  ject..** The Src
1f510 4c 69 73 74 20 6f 62 6a 65 63 74 20 69 73 20 75  List object is u
1f520 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
1f530 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1f540 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
1f550 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 74  statement, and t
1f560 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
1f570 20 63 61 6e 6e 6f 74 20 64 65 61 6c 20 77 69 74   cannot deal wit
1f580 68 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 36  h more.** than 6
1f590 34 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  4 tables in a jo
1f5a0 69 6e 2e 20 20 53 6f 20 61 6e 79 20 76 61 6c 75  in.  So any valu
1f5b0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34  e larger than 64
1f5c0 20 68 65 72 65 0a 2a 2a 20 69 73 20 73 75 66 66   here.** is suff
1f5d0 69 63 69 65 6e 74 20 66 6f 72 20 6d 6f 73 74 20  icient for most 
1f5e0 75 73 65 73 2e 20 20 53 6d 61 6c 6c 65 72 20 76  uses.  Smaller v
1f5f0 61 6c 75 65 73 2c 20 6c 69 6b 65 20 73 61 79 20  alues, like say 
1f600 31 30 2c 20 61 72 65 0a 2a 2a 20 61 70 70 72 6f  10, are.** appro
1f610 70 72 69 61 74 65 20 66 6f 72 20 73 6d 61 6c 6c  priate for small
1f620 20 61 6e 64 20 6d 65 6d 6f 72 79 2d 6c 69 6d 69   and memory-limi
1f630 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ted applications
1f640 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1f650 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 0a  ITE_MAX_SRCLIST.
1f660 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
1f670 4d 41 58 5f 53 52 43 4c 49 53 54 20 32 30 30 0a  MAX_SRCLIST 200.
1f680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78  #endif../*.** Ex
1f690 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
1f6a0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1f6b0 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
1f6c0 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
1f6d0 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
1f6e0 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
1f6f0 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
1f700 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
1f710 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
1f720 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
1f730 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
1f740 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
1f750 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
1f760 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
1f770 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
1f780 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
1f790 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
1f7a0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1f7b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1f7c0 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
1f7d0 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
1f7e0 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
1f7f0 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
1f800 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
1f810 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
1f820 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
1f830 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
1f840 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
1f850 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1f860 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
1f870 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
1f880 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
1f890 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
1f8a0 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
1f8b0 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
1f8c0 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
1f8d0 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
1f8e0 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
1f8f0 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
1f900 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1f910 61 74 69 6f 6e 20 66 61 69 6c 73 20 6f 72 20 74  ation fails or t
1f920 68 65 20 53 72 63 4c 69 73 74 20 62 65 63 6f 6d  he SrcList becom
1f930 65 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 6c 65  es too large, le
1f940 61 76 65 0a 2a 2a 20 74 68 65 20 6f 72 69 67 69  ave.** the origi
1f950 6e 61 6c 20 53 72 63 4c 69 73 74 20 75 6e 63 68  nal SrcList unch
1f960 61 6e 67 65 64 2c 20 72 65 74 75 72 6e 20 4e 55  anged, return NU
1f970 4c 4c 2c 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  LL, and leave an
1f980 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
1f990 2a 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  * in pParse..*/.
1f9a0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1f9b0 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a  SrcListEnlarge(.
1f9c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1f9d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1f9e0 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68 69  context into whi
1f9f0 63 68 20 65 72 72 6f 72 73 20 61 72 65 20 72 65  ch errors are re
1fa00 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c  ported */.  SrcL
1fa10 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1fa20 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1fa30 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1fa40 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1fa50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fa60 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1fa70 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1fa80 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1fa90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1faa0 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1fab0 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1fac0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1fad0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1fae0 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1faf0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1fb00 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1fb10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1fb20 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1fb30 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1fb40 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1fb50 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1fb60 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1fb70 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1fb80 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1fb90 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e  if( (u32)pSrc->n
1fba0 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1fbb0 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1fbc0 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1fbd0 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1fbe0 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 78 74  Src->nSrc*2+nExt
1fbf0 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74  ra;.    int nGot
1fc00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
1fc10 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1fc20 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1fc30 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53 51 4c 49  Src+nExtra>=SQLI
1fc40 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29  TE_MAX_SRCLIST )
1fc50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1fc60 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fc70 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f 4d 20 63  "too many FROM c
1fc80 6c 61 75 73 65 20 74 65 72 6d 73 2c 20 6d 61 78  lause terms, max
1fc90 3a 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  : %d",.         
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1fcb0 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53 54 29  ITE_MAX_SRCLIST)
1fcc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1fcd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fce0 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45 5f 4d 41  nAlloc>SQLITE_MA
1fcf0 58 5f 53 52 43 4c 49 53 54 20 29 20 6e 41 6c 6c  X_SRCLIST ) nAll
1fd00 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  oc = SQLITE_MAX_
1fd10 53 52 43 4c 49 53 54 3b 0a 20 20 20 20 70 4e 65  SRCLIST;.    pNe
1fd20 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1fd30 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1fd50 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1fd60 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1fd70 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1fd80 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1fd90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fda0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1fdb0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1fdc0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53   0;.    }.    pS
1fdd0 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e  rc = pNew;.    n
1fde0 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62  Got = (sqlite3Db
1fdf0 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70  MallocSize(db, p
1fe00 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70  New) - sizeof(*p
1fe10 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72  Src))/sizeof(pSr
1fe20 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20  c->a[0])+1;.    
1fe30 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e  pSrc->nAlloc = n
1fe40 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Got;.  }..  /* M
1fe50 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f  ove existing slo
1fe60 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
1fe70 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73  er the newly ins
1fe80 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a  erted slots.  **
1fe90 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 20   out of the way 
1fea0 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d  */.  for(i=pSrc-
1feb0 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61  >nSrc-1; i>=iSta
1fec0 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53  rt; i--){.    pS
1fed0 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20  rc->a[i+nExtra] 
1fee0 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  = pSrc->a[i];.  
1fef0 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b  }.  pSrc->nSrc +
1ff00 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20  = nExtra;..  /* 
1ff10 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61  Zero the newly a
1ff20 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a  llocated slots *
1ff30 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63  /.  memset(&pSrc
1ff40 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ->a[iStart], 0, 
1ff50 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1ff60 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f  ])*nExtra);.  fo
1ff70 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53  r(i=iStart; i<iS
1ff80 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b  tart+nExtra; i++
1ff90 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
1ffa0 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
1ffb0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
1ffc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ffd0 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69  e enlarged SrcLi
1ffe0 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  st */.  return p
1fff0 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  Src;.}.../*.** A
20000 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
20010 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
20020 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
20030 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
20040 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
20050 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
20060 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
20070 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
20080 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e   pTable is NULL.
20090 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74  .**.** A SrcList
200a0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
200b0 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
200c0 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  s an OOM error o
200d0 72 20 69 66 20 74 68 65 0a 2a 2a 20 53 72 63 4c  r if the.** SrcL
200e0 69 73 74 20 67 72 6f 77 73 20 74 6f 20 6c 61 72  ist grows to lar
200f0 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  ge.  The returne
20100 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
20110 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
20120 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
20130 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
20140 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
20150 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
20160 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
20170 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
20180 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
20190 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
201a0 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
201b0 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
201c0 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
201d0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
201e0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
201f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
20200 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
20210 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
20220 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
20230 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
20240 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
20250 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
20260 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
20270 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
20280 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
20290 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
202a0 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
202b0 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
202c0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
202d0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
202e0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
202f0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
20300 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
20310 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
20320 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
20330 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
20340 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
20350 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
20360 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
20370 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
20380 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
20390 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
203a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
203b0 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
203c0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
203d0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
203e0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
203f0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
20400 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
20410 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
20420 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
20430 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
20440 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
20450 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
20460 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
20470 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
20480 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
20490 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
204a0 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
204b0 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
204c0 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
204d0 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
204e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
204f0 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
20500 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
20510 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
20520 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
20530 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
20540 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
20550 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
20560 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
20570 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
20580 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
20590 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
205a0 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
205b0 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
205c0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
205d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
205e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
205f0 6f 6e 74 65 78 74 2c 20 69 6e 20 77 68 69 63 68  ontext, in which
20600 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 70 6f   errors are repo
20610 72 74 65 64 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rted */.  SrcLis
20620 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
20630 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
20640 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72  SrcList. NULL cr
20650 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c  eates a new SrcL
20660 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ist */.  Token *
20670 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  pTable,      /* 
20680 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20  Table to append 
20690 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
206a0 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61  abase    /* Data
206b0 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c  base of the tabl
206c0 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  e */.){.  struct
206d0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
206e0 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
206f0 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
20700 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70  Database==0 || p
20710 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20  Table!=0 );  /* 
20720 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69  Cannot have C wi
20730 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 61 73 73  thout B */.  ass
20740 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
20750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
20760 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 64  se->db!=0 );.  d
20770 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20780 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
20790 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
207a0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
207b0 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  NN(pParse->db, s
207c0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
207d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
207e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
207f0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
20800 20 3d 20 31 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 1;.    pList-
20810 3e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 6d  >nSrc = 1;.    m
20820 65 6d 73 65 74 28 26 70 4c 69 73 74 2d 3e 61 5b  emset(&pList->a[
20830 30 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4c  0], 0, sizeof(pL
20840 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
20850 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75   pList->a[0].iCu
20860 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  rsor = -1;.  }el
20870 73 65 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  se{.    SrcList 
20880 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  *pNew = sqlite3S
20890 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 70 50  rcListEnlarge(pP
208a0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 31 2c 20  arse, pList, 1, 
208b0 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
208c0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
208d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
208e0 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
208f0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pList);.      re
20900 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
20910 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
20920 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d   pNew;.    }.  }
20930 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
20940 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
20950 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
20960 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
20970 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
20980 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
20990 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
209a0 65 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  e ){.    pItem->
209b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
209c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
209d0 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20   pDatabase);.   
209e0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
209f0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
20a00 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
20a10 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ble);.  }else{. 
20a20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
20a30 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
20a40 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
20a50 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  e);.    pItem->z
20a60 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
20a70 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
20a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
20a90 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64  n VdbeCursor ind
20aa0 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c  ex numbers to al
20ab0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
20ac0 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
20ad0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
20ae0 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
20af0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
20b00 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
20b10 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
20b20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
20b30 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
20b40 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
20b50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
20b60 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
20b70 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
20b80 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
20b90 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
20ba0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
20bb0 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
20bc0 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
20bd0 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
20be0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
20bf0 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
20c00 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
20c10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20c20 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
20c30 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74  sors(pParse, pIt
20c40 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  em->pSelect->pSr
20c50 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
20c60 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
20c70 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
20c80 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
20c90 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
20ca0 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
20cb0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
20cc0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
20cd0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
20ce0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
20cf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20d00 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
20d10 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
20d20 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
20d30 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
20d40 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
20d50 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
20d60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20d70 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
20d80 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
20d90 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
20da0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
20db0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20dc0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
20dd0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
20de0 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20  g.isIndexedBy ) 
20df0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20e00 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  , pItem->u1.zInd
20e10 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28  exedBy);.    if(
20e20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62   pItem->fg.isTab
20e30 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78  Func ) sqlite3Ex
20e40 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
20e50 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63   pItem->u1.pFunc
20e60 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
20e70 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
20e80 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
20e90 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
20ea0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
20eb0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
20ec0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
20ed0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e  e(db, pItem->pOn
20ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
20ef0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
20f00 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
20f10 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
20f20 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b  eeNN(db, pList);
20f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
20f40 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
20f50 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
20f60 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d  o add a new term
20f70 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
20f80 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d  f a growing FROM
20f90 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70   clause.  The "p
20fa0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  " parameter is t
20fb0 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  he part of.** th
20fc0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68  e FROM clause th
20fd0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
20fe0 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e  een constructed.
20ff0 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a    "p" is NULL.**
21000 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
21010 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
21020 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
21030 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
21040 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  base.** are the 
21050 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
21060 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e  e and database n
21070 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
21080 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a   clause term..**
21090 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55   pDatabase is NU
210a0 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  LL if the databa
210b0 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65  se name qualifie
210c0 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74  r is missing - t
210d0 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65  he.** usual case
210e0 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68  .  If the term h
210f0 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65  as an alias, the
21100 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20  n pAlias points 
21110 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20  to the.** alias 
21120 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74  token.  If the t
21130 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72  erm is a subquer
21140 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72  y, then pSubquer
21150 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45  y is the.** SELE
21160 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  CT statement tha
21170 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  t the subquery e
21180 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61  ncodes.  The pTa
21190 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61  ble and.** pData
211a0 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20  base parameters 
211b0 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62  are NULL for sub
211c0 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f  queries.  The pO
211d0 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20  n and pUsing.** 
211e0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74  parameters are t
211f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
21200 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
21210 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  lauses..**.** Re
21220 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69  turn a new SrcLi
21230 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73  st which encodes
21240 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74   is the FROM wit
21250 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72  h the new.** ter
21260 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c  m added..*/.SrcL
21270 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
21280 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
21290 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
212a0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
212b0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
212c0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c  */.  SrcList *p,
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212e0 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66  The left part of
212f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21300 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f   already seen */
21310 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
21320 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
21330 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
21340 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52  to add to the FR
21350 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54  OM clause */.  T
21360 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c  oken *pDatabase,
21370 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21380 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
21390 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65  ontaining pTable
213a0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c   */.  Token *pAl
213b0 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ias,          /*
213c0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
213d0 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73  side of the AS s
213e0 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
213f0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
21400 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73  ery,      /* A s
21410 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20  ubquery used in 
21420 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65  place of a table
21430 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20   name */.  Expr 
21440 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *pOn,           
21450 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61     /* The ON cla
21460 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
21470 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e  .  IdList *pUsin
21480 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g          /* Th
21490 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  e USING clause o
214a0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  f a join */.){. 
214b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
214c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
214d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
214e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21  rse->db;.  if( !
214f0 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73  p && (pOn || pUs
21500 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ing) ){.    sqli
21510 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
21520 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75  se, "a JOIN clau
21530 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
21540 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20  efore %s", .    
21550 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20    (pOn ? "ON" : 
21560 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a  "USING").    );.
21570 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
21580 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
21590 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63    p = sqlite3Src
215a0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
215b0 65 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44  e, p, pTable, pD
215c0 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
215d0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  p==0 ){.    goto
215e0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
215f0 6f 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  or;.  }.  assert
21600 28 20 70 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20  ( p->nSrc>0 );. 
21610 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
21620 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
21630 65 72 74 28 20 28 70 54 61 62 6c 65 3d 3d 30 29  ert( (pTable==0)
21640 3d 3d 28 70 44 61 74 61 62 61 73 65 3d 3d 30 29  ==(pDatabase==0)
21650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
21660 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  tem->zName==0 ||
21670 20 70 44 61 74 61 62 61 73 65 21 3d 30 20 29 3b   pDatabase!=0 );
21680 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45  .  if( IN_RENAME
21690 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65 6d  _OBJECT && pItem
216a0 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 54  ->zName ){.    T
216b0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 28  oken *pToken = (
216c0 41 4c 57 41 59 53 28 70 44 61 74 61 62 61 73 65  ALWAYS(pDatabase
216d0 29 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e  ) && pDatabase->
216e0 7a 29 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a  z) ? pDatabase :
216f0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c   pTable;.    sql
21700 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
21710 61 70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  ap(pParse, pItem
21720 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29  ->zName, pToken)
21730 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21740 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69  pAlias!=0 );.  i
21750 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  f( pAlias->n ){.
21760 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
21770 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
21780 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c  romToken(db, pAl
21790 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  ias);.  }.  pIte
217a0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m->pSelect = pSu
217b0 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d  bquery;.  pItem-
217c0 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49  >pOn = pOn;.  pI
217d0 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55  tem->pUsing = pU
217e0 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sing;.  return p
217f0 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  ;.. append_from_
21800 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28  error:.  assert(
21810 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p==0 );.  sqlit
21820 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
21830 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOn);.  sqlite3
21840 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
21850 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69   pUsing);.  sqli
21860 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
21870 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a  db, pSubquery);.
21880 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21890 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45  *.** Add an INDE
218a0 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
218b0 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20  DEXED clause to 
218c0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
218d0 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d  y added .** elem
218e0 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
218f0 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  e-list passed as
21900 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21910 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
21920 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
21930 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61  xedBy(Parse *pPa
21940 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
21950 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64   Token *pIndexed
21960 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  By){.  assert( p
21970 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a  IndexedBy!=0 );.
21980 20 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65    if( p && pInde
21990 78 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20  xedBy->n>0 ){.  
219a0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
219b0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
219c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72    assert( p->nSr
219d0 63 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  c>0 );.    pItem
219e0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
219f0 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
21a00 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e   pItem->fg.notIn
21a10 64 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  dexed==0 );.    
21a20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66  assert( pItem->f
21a30 67 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30  g.isIndexedBy==0
21a40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21a50 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
21a60 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  unc==0 );.    if
21a70 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d  ( pIndexedBy->n=
21a80 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42  =1 && !pIndexedB
21a90 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  y->z ){.      /*
21aa0 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22   A "NOT INDEXED"
21ab0 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70   clause was supp
21ac0 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e  lied. See parse.
21ad0 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  y .      ** cons
21ae0 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f  truct "indexed_o
21af0 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  pt" for details.
21b00 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   */.      pItem-
21b10 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  >fg.notIndexed =
21b20 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
21b30 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a       pItem->u1.z
21b40 49 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69  IndexedBy = sqli
21b50 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
21b60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
21b70 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20  dexedBy);.      
21b80 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  pItem->fg.isInde
21b90 78 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d  xedBy = 1;.    }
21ba0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
21bb0 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75  d the list of fu
21bc0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
21bd0 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20   to the SrcList 
21be0 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74  entry for a.** t
21bf0 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63  able-valued-func
21c00 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
21c10 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63  lite3SrcListFunc
21c20 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  Args(Parse *pPar
21c30 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
21c40 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
21c50 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
21c60 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21c70 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
21c80 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
21c90 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
21ca0 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
21cb0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
21cc0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
21cd0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
21ce0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
21cf0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
21d00 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
21d10 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c  u1.pFuncArg = pL
21d20 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  ist;.    pItem->
21d30 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31  fg.isTabFunc = 1
21d40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
21d50 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
21d60 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
21d70 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a   pList);.  }.}..
21d80 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
21d90 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
21da0 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
21db0 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
21dc0 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
21dd0 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
21de0 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
21df0 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
21e00 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
21e10 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
21e20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
21e30 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
21e40 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
21e50 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
21e60 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
21e70 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
21e80 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
21e90 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
21ea0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
21eb0 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
21ec0 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
21ed0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
21ee0 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
21ef0 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
21f00 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
21f10 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
21f20 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
21f30 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
21f40 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
21f50 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
21f60 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
21f70 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
21f80 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
21f90 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
21fa0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
21fb0 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
21fc0 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
21fd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
21fe0 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
21ff0 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
22000 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
22010 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
22020 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
22030 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
22040 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [i].fg.jointype 
22050 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a  = p->a[i-1].fg.j
22060 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
22070 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f     p->a[0].fg.jo
22080 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
22090 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
220a0 65 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20  e VDBE code for 
220b0 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
220c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
220d0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
220e0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
220f0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
22100 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
22110 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
22120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
22130 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
22140 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
22150 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
22160 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
22170 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
22180 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
22190 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
221a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
221b0 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
221c0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
221d0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
221e0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
221f0 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
22200 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
22210 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
22220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22230 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
22240 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
22250 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
22260 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
22270 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
22280 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
22290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
222a0 4f 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op0(v, OP_AutoCo
222b0 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mmit);.}../*.** 
222c0 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f  Generate VDBE co
222d0 64 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20  de for a COMMIT 
222e0 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74  or ROLLBACK stat
222f0 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66  ement..** Code f
22300 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67  or ROLLBACK is g
22310 65 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70  enerated if eTyp
22320 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20  e==TK_ROLLBACK. 
22330 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f   Otherwise.** co
22340 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
22350 66 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f  for a COMMIT..*/
22360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
22370 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
22380 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65  e *pParse, int e
22390 54 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  Type){.  Vdbe *v
223a0 3b 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61  ;.  int isRollba
223b0 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ck;..  assert( p
223c0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
223d0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
223e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
223f0 20 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49   eType==TK_COMMI
22400 54 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45  T || eType==TK_E
22410 4e 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f  ND || eType==TK_
22420 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73  ROLLBACK );.  is
22430 52 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65  Rollback = eType
22440 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ==TK_ROLLBACK;. 
22450 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
22460 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
22470 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
22480 2c 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c  , .       isRoll
22490 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b  back ? "ROLLBACK
224a0 22 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  " : "COMMIT", 0,
224b0 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
224c0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
224d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
224e0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
224f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
22510 43 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c  Commit, 1, isRol
22520 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  lback);.  }.}../
22530 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22540 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
22550 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20  the parser when 
22560 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d  it parses a comm
22570 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a  and to create,.*
22580 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  * release or rol
22590 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76  lback an SQL sav
225a0 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64  epoint. .*/.void
225b0 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e   sqlite3Savepoin
225c0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
225d0 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a   int op, Token *
225e0 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
225f0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
22600 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
22610 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
22620 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
22630 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
22640 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
22650 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
22660 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
22670 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74  IZATION.    stat
22680 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
22690 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22  const az[] = { "
226a0 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45  BEGIN", "RELEASE
226b0 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b  ", "ROLLBACK" };
226c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41  .    assert( !SA
226d0 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26  VEPOINT_BEGIN &&
226e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
226f0 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49  SE==1 && SAVEPOI
22700 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29  NT_ROLLBACK==2 )
22710 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
22720 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75   !v || sqlite3Au
22730 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
22740 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54  SQLITE_SAVEPOINT
22750 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c  , az[op], zName,
22760 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   0) ){.      sql
22770 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
22780 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e->db, zName);. 
22790 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
227a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
227b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
227c0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c  avepoint, op, 0,
227d0 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59   0, zName, P4_DY
227e0 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
227f0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
22800 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
22810 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61   is open and ava
22820 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20  ilable for use. 
22830 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   Return.** the n
22840 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
22850 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f    Leave any erro
22860 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68  r messages in th
22870 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
22880 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
22890 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61  e3OpenTempDataba
228a0 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
228b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
228c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
228d0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
228e0 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73  pBt==0 && !pPars
228f0 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
22900 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
22910 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74  ree *pBt;.    st
22920 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66  atic const int f
22930 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20  lags = .        
22940 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
22950 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20  ADWRITE |.      
22960 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22970 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
22980 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
22990 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
229a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
229b0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
229c0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
229d0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
229e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
229f0 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
22a00 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74  Vfs, 0, db, &pBt
22a10 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  , 0, flags);.   
22a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
22a40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22a50 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  se, "unable to o
22a60 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
22a70 64 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20  database ".     
22a80 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f     "file for sto
22a90 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74  ring temporary t
22aa0 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70  ables");.      p
22ab0 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a  Parse->rc = rc;.
22ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
22ad0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44      }.    db->aD
22ae0 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a  b[1].pBt = pBt;.
22af0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
22b00 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
22b10 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
22b20 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42  _NOMEM==sqlite3B
22b30 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
22b40 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67  pBt, db->nextPag
22b50 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b  esize, -1, 0) ){
22b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
22b70 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
22b80 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
22b90 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
22ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
22bb0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
22bc0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
22bd0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  e will need to b
22be0 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f  e verified.** fo
22bf0 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  r database iDb. 
22c00 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74   The code to act
22c10 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65  ually verify the
22c20 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a   schema cookie.*
22c30 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20  * will occur at 
22c40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
22c50 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e  op-level VDBE an
22c60 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  d will be genera
22c70 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79  ted.** later, by
22c80 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
22c90 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
22ca0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
22cb0 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
22cc0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
22cd0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
22ce0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
22cf0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
22d00 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  e);..  assert( i
22d10 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
22d20 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
22d30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
22d40 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ->db->aDb[iDb].p
22d50 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
22d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  );.  assert( iDb
22d70 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  <SQLITE_MAX_ATTA
22d80 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65  CHED+2 );.  asse
22d90 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
22da0 61 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73  aMutexHeld(pPars
22db0 65 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29  e->db, iDb, 0) )
22dc0 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65  ;.  if( DbMaskTe
22dd0 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  st(pToplevel->co
22de0 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d  okieMask, iDb)==
22df0 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  0 ){.    DbMaskS
22e00 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f  et(pToplevel->co
22e10 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  okieMask, iDb);.
22e20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
22e30 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
22e40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
22e50 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
22e60 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20  pToplevel);.    
22e70 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
22e80 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69  f argument zDb i
22e90 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c  s NULL, then cal
22ea0 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  l sqlite3CodeVer
22eb0 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20  ifySchema() for 
22ec0 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65  each .** attache
22ed0 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65  d database. Othe
22ee0 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74  rwise, invoke it
22ef0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
22f00 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79  e named zDb only
22f10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22f20 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
22f30 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
22f40 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
22f50 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65   *zDb){.  sqlite
22f60 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
22f70 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  db;.  int i;.  f
22f80 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
22f90 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
22fa0 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
22fb0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
22fc0 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c  >pBt && (!zDb ||
22fd0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
22fe0 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62  mp(zDb, pDb->zDb
22ff0 53 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20  SName)) ){.     
23000 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
23010 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
23020 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   i);.    }.  }.}
23030 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
23040 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
23050 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
23060 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
23070 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
23080 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
23090 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
230a0 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
230b0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
230c0 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
230d0 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
230e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
230f0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
23100 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
23110 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
23120 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
23130 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
23140 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
23150 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
23160 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
23170 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
23180 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
23190 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
231a0 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
231b0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
231c0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
231d0 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
231e0 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
231f0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
23200 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
23210 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
23220 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
23230 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
23240 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
23250 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
23260 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
23270 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
23280 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
23290 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
232a0 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
232b0 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
232c0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
232d0 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
232e0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
232f0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
23300 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
23310 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
23320 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
23330 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
23340 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
23350 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
23360 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
23370 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
23380 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
23390 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
233a0 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f  ask, iDb);.  pTo
233b0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
233c0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
233d0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
233e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
233f0 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
23400 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
23410 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
23420 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
23430 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
23440 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
23450 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
23460 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
23470 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
23480 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
23490 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
234a0 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
234b0 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
234c0 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
234d0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
234e0 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
234f0 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
23500 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
23510 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
23520 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
23530 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
23540 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
23550 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
23560 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
23570 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
23580 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
23590 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
235a0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
235b0 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
235c0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
235d0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
235e0 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
235f0 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
23600 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
23610 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
23620 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
23630 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
23640 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
23650 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
23660 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
23670 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
23680 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
23690 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
236a0 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
236b0 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
236c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
236d0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
236e0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
236f0 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
23700 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
23710 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
23720 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
23730 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
23740 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
23750 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
23760 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
23770 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
23780 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
23790 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
237a0 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
237b0 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
237c0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
237d0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
237e0 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
237f0 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
23800 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
23810 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
23820 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
23830 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
23840 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
23850 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
23860 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
23870 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
23880 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
23890 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
238a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
238b0 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
238c0 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
238d0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
238e0 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
238f0 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
23900 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
23910 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
23920 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
23930 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
23940 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
23950 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
23960 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
23970 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
23980 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
23990 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
239a0 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
239b0 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
239c0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
239d0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
239e0 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
239f0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
23a00 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
23a10 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
23a20 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
23a30 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23a40 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
23a50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23a60 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
23a70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23a80 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
23a90 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
23aa0 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
23ab0 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
23ac0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
23ad0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
23ae0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
23af0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
23b00 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
23b10 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20  message */.  i8 
23b20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f  p4type,        /
23b30 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
23b40 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20  4_TRANSIENT */. 
23b50 20 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20   u8 p5Errmsg    
23b60 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20     /* P5_ErrMsg 
23b70 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  type */.){.  Vdb
23b80 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
23b90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
23ba0 20 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64   assert( (errCod
23bb0 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  e&0xff)==SQLITE_
23bc0 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20  CONSTRAINT );.  
23bd0 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  if( onError==OE_
23be0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Abort ){.    sql
23bf0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
23c00 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rse);.  }.  sqli
23c10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
23c20 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64   OP_Halt, errCod
23c30 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70  e, onError, 0, p
23c40 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71  4, p4type);.  sq
23c50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
23c60 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a  5(v, p5Errmsg);.
23c70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
23c80 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
23c90 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
23ca0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
23cb0 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76   violation..*/.v
23cc0 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75  oid sqlite3Uniqu
23cd0 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  eConstraint(.  P
23ce0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
23cf0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23d00 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ext */.  int onE
23d10 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
23d20 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
23d30 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
23d40 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
23d50 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20  x that triggers 
23d60 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  the constraint *
23d70 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
23d80 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74  r;.  int j;.  St
23d90 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20  rAccum errMsg;. 
23da0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
23db0 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20  Idx->pTable;..  
23dc0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
23dd0 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61  nit(&errMsg, pPa
23de0 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32  rse->db, 0, 0, 2
23df0 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d  00);.  if( pIdx-
23e00 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20  >aColExpr ){.   
23e10 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
23e20 65 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69  endf(&errMsg, "i
23e30 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78  ndex '%q'", pIdx
23e40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ->zName);.  }els
23e50 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  e{.    for(j=0; 
23e60 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
23e70 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   j++){.      cha
23e80 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61  r *zCol;.      a
23e90 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
23ea0 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20  olumn[j]>=0 );. 
23eb0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
23ec0 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
23ed0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
23ee0 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73  .      if( j ) s
23ef0 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
23f00 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c  d(&errMsg, ", ",
23f10 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   2);.      sqlit
23f20 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c  e3_str_appendall
23f30 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e  (&errMsg, pTab->
23f40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
23f50 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
23f60 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31  (&errMsg, ".", 1
23f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23f80 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26  _str_appendall(&
23f90 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20  errMsg, zCol);. 
23fa0 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20     }.  }.  zErr 
23fb0 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  = sqlite3StrAccu
23fc0 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29  mFinish(&errMsg)
23fd0 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  ;.  sqlite3HaltC
23fe0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
23ff0 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79  , .    IsPrimary
24000 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f  KeyIndex(pIdx) ?
24010 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
24020 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20  NT_PRIMARYKEY . 
24030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24040 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c             : SQL
24050 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
24060 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72  NIQUE,.    onErr
24070 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e  or, zErr, P4_DYN
24080 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61  AMIC, P5_Constra
24090 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a  intUnique);.}...
240a0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
240b0 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e  _Halt due to non
240c0 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a  -unique rowid..*
240d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
240e0 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  widConstraint(. 
240f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
24100 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
24110 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
24120 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
24130 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
24140 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  ion algorithm */
24150 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20  .  Table *pTab  
24160 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
24170 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75  e with the non-u
24180 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a  nique rowid */ .
24190 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  ){.  char *zMsg;
241a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
241b0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
241c0 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ){.    zMsg = sq
241d0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
241e0 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22  rse->db, "%s.%s"
241f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
24220 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
24230 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  .zName);.    rc 
24240 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
24250 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  INT_PRIMARYKEY;.
24260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73    }else{.    zMs
24270 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
24280 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
24290 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d  %s.rowid", pTab-
242a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  >zName);.    rc 
242b0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
242c0 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20  INT_ROWID;.  }. 
242d0 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
242e0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72  traint(pParse, r
242f0 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67  c, onError, zMsg
24300 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20  , P4_DYNAMIC,.  
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61        P5_Constra
24330 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f  intUnique);.}../
24340 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
24350 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
24360 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
24370 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
24380 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
24390 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
243a0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
243b0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
243c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
243d0 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
243e0 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
243f0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
24400 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
24410 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
24420 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
24430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
24440 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
24450 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
24460 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
24470 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
24480 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49  sert( z!=0 || pI
24490 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
244a0 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ]<0 );.    if( p
244b0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
244c0 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69  i]>=0 && 0==sqli
244d0 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
244e0 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
244f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
24500 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
24510 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
24520 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
24530 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
24540 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
24550 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
24560 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
24570 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
24580 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
24590 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
245a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
245b0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
245c0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
245d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
245e0 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
245f0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
24600 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
24610 54 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64 65  Tab) ){.    Inde
24620 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
24630 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
24640 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
24650 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20  ith pTab */..   
24660 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62   for(pIndex=pTab
24670 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
24680 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d  ; pIndex=pIndex-
24690 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
246a0 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
246b0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
246c0 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
246d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
246e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
246f0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
24700 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
24710 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
24720 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
24730 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
24740 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
24750 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
24760 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
24770 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
24780 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
24790 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
247a0 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
247b0 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  f all tables in 
247c0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68  all databases wh
247d0 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63  ere the.** indic
247e0 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  es use the colla
247f0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
24800 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d  oll.  If pColl==
24810 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
24820 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  .** all indices 
24830 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23  everywhere..*/.#
24840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24850 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
24860 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61  c void reindexDa
24870 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70  tabases(Parse *p
24880 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73  Parse, char cons
24890 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20  t *zColl){.  Db 
248a0 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
248b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
248c0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  ngle database */
248d0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
248f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69  * The database i
24900 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
24910 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24920 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
24930 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
24940 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73  nection */.  Has
24950 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20  hElem *k;       
24960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
24970 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
24980 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20  les in pDb */.  
24990 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
249a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
249b0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
249c0 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  tabase */..  ass
249d0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
249e0 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
249f0 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64  (db) );  /* Need
24a00 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
24a10 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44  cess */.  for(iD
24a20 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
24a30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
24a40 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
24a50 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
24a60 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
24a70 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
24a80 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
24a90 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
24aa0 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
24ab0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
24ac0 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
24ad0 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
24ae0 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
24af0 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
24b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
24b10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
24b20 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
24b30 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
24b40 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
24b50 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
24b80 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
24b90 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
24ba0 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
24bb0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
24bc0 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
24bd0 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
24be0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
24bf0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
24c00 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
24c10 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
24c20 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
24c30 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
24c40 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
24c50 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
24c60 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
24c70 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
24c80 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
24c90 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
24ca0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
24cb0 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
24cc0 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
24cd0 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
24ce0 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
24cf0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
24d00 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
24d10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24d20 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
24d30 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
24d40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
24d50 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
24d60 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
24d70 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
24d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
24d90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
24da0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
24db0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
24dc0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
24dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
24de0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
24df0 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
24e00 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
24e10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
24e20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
24e30 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
24e60 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
24e70 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
24e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
24e90 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
24ea0 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
24eb0 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ed0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
24ee0 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
24ef0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
24f00 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
24f10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
24f20 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
24f30 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
24f40 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
24f50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
24f60 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
24f70 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
24f80 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
24f90 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
24fa0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
24fb0 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
24fc0 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
24fd0 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
24fe0 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
24ff0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
25000 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
25010 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
25020 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
25030 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29   if( pName1==0 )
25040 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
25050 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
25060 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
25070 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52   }else if( NEVER
25080 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70  (pName2==0) || p
25090 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  Name2->z==0 ){. 
250a0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a     char *zColl;.
250b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
250c0 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f  e1->z );.    zCo
250d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ll = sqlite3Name
250e0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
250f0 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  ->db, pName1);. 
25100 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20     if( !zColl ) 
25110 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c  return;.    pCol
25120 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
25130 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
25140 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20  b), zColl, 0);. 
25150 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
25160 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74        reindexDat
25170 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a  abases(pParse, z
25180 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Coll);.      sql
25190 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
251a0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74  Coll);.      ret
251b0 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
251c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
251d0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69   zColl);.  }.  i
251e0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
251f0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
25200 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
25210 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66  &pObjName);.  if
25220 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
25230 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  ;.  z = sqlite3N
25240 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
25250 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66   pObjName);.  if
25260 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
25270 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
25280 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
25290 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
252a0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
252b0 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
252c0 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
252d0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
252e0 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
252f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
25300 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
25310 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
25320 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
25330 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
25340 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
25350 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
25360 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
25370 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
25380 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
25390 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
253a0 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
253b0 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
253c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
253d0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
253e0 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
253f0 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
25400 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
25410 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
25420 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
25430 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
25440 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
25450 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
25460 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
25470 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
25480 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
25490 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
254a0 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  f() on the retur
254b0 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68  ned object.** wh
254c0 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68  en it has finish
254d0 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a  ed using it..*/.
254e0 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
254f0 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50  KeyInfoOfIndex(P
25500 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
25510 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
25520 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
25530 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
25540 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49  .  int nKey = pI
25550 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b  dx->nKeyCol;.  K
25560 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20  eyInfo *pKey;.  
25570 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
25580 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
25590 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74  f( pIdx->uniqNot
255a0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79  Null ){.    pKey
255b0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
255c0 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
255d0 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b  b, nKey, nCol-nK
255e0 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
255f0 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
25600 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
25610 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30  rse->db, nCol, 0
25620 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65  );.  }.  if( pKe
25630 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
25640 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
25650 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29  sWriteable(pKey)
25660 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
25670 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
25680 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25690 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
256a0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
256b0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
256c0 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53   zColl==sqlite3S
256d0 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20  trBINARY ? 0 :. 
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
25700 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
25710 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
25720 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
25730 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
25740 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
25750 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
25760 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
25770 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
25780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f  >rc==SQLITE_ERRO
25790 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 45  R_MISSING_COLLSE
257a0 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Q );.      if( p
257b0 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d 30  Idx->bNoQuery==0
257c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44   ){.        /* D
257d0 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69 6e  eactivate the in
257e0 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20 63  dex because it c
257f0 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e 6f  ontains an unkno
25800 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 20  wn collating.   
25810 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 65       ** sequence
25820 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  .  The only way 
25830 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65 20  to reactive the 
25840 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c 6f  index is to relo
25850 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ad the.        *
25860 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69 6e  * schema.  Addin
25870 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63 6f  g the missing co
25880 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
25890 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 0a   later does not.
258a0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63 74          ** react
258b0 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20 20  ive the index.  
258c0 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  The application 
258d0 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20 74  had the chance t
258e0 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 20  o register.     
258f0 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 6e     ** the missin
25900 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68  g index using th
25910 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 64  e collation-need
25920 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 6f  ed callback.  Fo
25930 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6d  r.        ** sim
25940 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65 20  plicity, SQLite 
25950 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 68  will not give th
25960 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 20  e application a 
25970 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a 20  second chance.. 
25980 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25990 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79    pIdx->bNoQuery
259a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
259b0 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
259c0 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a 20  E_ERROR_RETRY;. 
259d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
259e0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
259f0 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b  (pKey);.      pK
25a00 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ey = 0;.    }.  
25a10 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
25a20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
25a30 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a  TE_OMIT_CTE./* .
25a40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25a50 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
25a60 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70  per CTE by the p
25a70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73  arser while pars
25a80 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63  ing a .** WITH c
25a90 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20  lause. .*/.With 
25aa0 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28  *sqlite3WithAdd(
25ab0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25ac0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
25ad0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
25ae0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
25af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
25b00 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75  isting WITH clau
25b10 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
25b20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
25b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
25b40 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74   of the common-t
25b50 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
25b60 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20  st *pArglist,   
25b70 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f    /* Optional co
25b80 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66  lumn name list f
25b90 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
25ba0 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79    Select *pQuery
25bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
25bc0 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ry used to initi
25bd0 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
25be0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
25bf0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
25c00 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a  ;.  With *pNew;.
25c10 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a    char *zName;..
25c20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
25c30 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20  the CTE name is 
25c40 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68  unique within th
25c50 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  is WITH clause. 
25c60 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f  If.  ** not, sto
25c70 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  re an error in t
25c80 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
25c90 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  re. */.  zName =
25ca0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
25cb0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
25cc0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
25cd0 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29  zName && pWith )
25ce0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
25cf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
25d00 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
25d10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25d20 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
25d30 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  With->a[i].zName
25d40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25d50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
25d60 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
25d70 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61  te WITH table na
25d80 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
25d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25da0 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20   }..  if( pWith 
25db0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
25dc0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
25dd0 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
25de0 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
25df0 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
25e00 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
25e10 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
25e20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
25e30 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
25e40 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
25e50 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
25e60 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
25e70 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 7a  t( (pNew!=0 && z
25e80 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d 3e  Name!=0) || db->
25e90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
25ea0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
25eb0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
25ec0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
25ed0 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 73  lete(db, pArglis
25ee0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  t);.    sqlite3S
25ef0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
25f00 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
25f10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
25f20 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 20  Name);.    pNew 
25f30 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65  = pWith;.  }else
25f40 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  {.    pNew->a[pN
25f50 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63  ew->nCte].pSelec
25f60 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 20  t = pQuery;.    
25f70 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43  pNew->a[pNew->nC
25f80 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67  te].pCols = pArg
25f90 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  list;.    pNew->
25fa0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e  a[pNew->nCte].zN
25fb0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
25fc0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
25fd0 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30  Cte].zCteErr = 0
25fe0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
25ff0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
26000 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
26010 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
26020 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
26030 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
26040 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26050 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
26060 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
26070 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
26080 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
26090 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
260a0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
260b0 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
260c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
260d0 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
260e0 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
260f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26100 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
26110 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
26120 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
26130 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
26140 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
26150 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
26160 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
26170 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
26180 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
26190 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
261a0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
261b0 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.