/ Hex Artifact Content
Login

Artifact 27471914e516d7d0f21d16c74f9e84bdfda1160bfd11e33a74cbe1d5a08dbc9e:


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 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
2120: 61 6e 20 72 65 73 75 6c 74 20 65 69 74 68 65 72  an result either
2130: 20 66 72 6f 6d 20 61 6e 20 4f 4f 4d 20 6f 72 20   from an OOM or 
2140: 62 65 63 61 75 73 65 20 74 68 65 20 66 6f 72 6d  because the form
2150: 61 74 74 65 64 20 73 74 72 69 6e 67 0a 20 20 20  atted string.   
2160: 20 2a 2a 20 65 78 63 65 65 64 73 20 53 51 4c 49   ** exceeds SQLI
2170: 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 2e  TE_LIMIT_LENGTH.
2180: 20 20 49 6e 20 74 68 65 20 6c 61 74 74 65 72 20    In the latter 
2190: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
21a0: 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 6e 20 65   set.    ** an e
21b0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
21c0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
21d0: 64 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20 3d  d ) pParse->rc =
21e0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3b 0a   SQLITE_TOOBIG;.
21f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
2200: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
2210: 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65    }.  pParse->ne
2220: 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79  sted++;.  memcpy
2230: 28 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f  (saveBuf, PARSE_
2240: 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41  TAIL(pParse), PA
2250: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2260: 6d 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49  memset(PARSE_TAI
2270: 4c 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41  L(pParse), 0, PA
2280: 52 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20  RSE_TAIL_SZ);.  
2290: 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72  sqlite3RunParser
22a0: 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26  (pParse, zSql, &
22b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
22c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
22d0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22e0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c  3DbFree(db, zSql
22f0: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53  );.  memcpy(PARS
2300: 45 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20  E_TAIL(pParse), 
2310: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54  saveBuf, PARSE_T
2320: 41 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AIL_SZ);.  pPars
2330: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
2340: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2350: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
2360: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2370: 20 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68   if zTable is th
2380: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
2390: 73 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20  stem table that 
23a0: 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69  stores the.** li
23b0: 73 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20  st of users and 
23c0: 74 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65  their access cre
23d0: 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74  dentials..*/.int
23e0: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
23f0: 54 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  Table(const char
2400: 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74   *zTable){.  ret
2410: 75 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69  urn sqlite3_stri
2420: 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
2430: 69 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d  ite_user")==0;.}
2440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c  .#endif../*.** L
2450: 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ocate the in-mem
2460: 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68  ory structure th
2470: 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70  at describes a p
2480: 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
2490: 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65  se.** table give
24a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
24b0: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70  at table and (op
24c0: 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61  tionally) the na
24d0: 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  me of the.** dat
24e0: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
24f0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2500: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
2510: 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  found..**.** If 
2520: 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20  zDatabase is 0, 
2530: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72  all databases ar
2540: 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
2550: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  he table and the
2560: 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69  .** first matchi
2570: 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75  ng table is retu
2580: 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b  rned.  (No check
2590: 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ing for duplicat
25a0: 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
25b0: 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20   is done.)  The 
25c0: 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20  search order is 
25d0: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
25e0: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a   MAIN, then any.
25f0: 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ** auxiliary dat
2600: 61 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69  abases added usi
2610: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2620: 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  mmand..**.** See
2630: 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63   also sqlite3Loc
2640: 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54  ateTable()..*/.T
2650: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e  able *sqlite3Fin
2660: 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  dTable(sqlite3 *
2670: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
2680: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
2690: 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20  r *zDatabase){. 
26a0: 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20   Table *p = 0;. 
26b0: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c   int i;..  /* Al
26c0: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
26d0: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
26e0: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
26f0: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2700: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2710: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2720: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2730: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2740: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2750: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2760: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
2770: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
2780: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
2790: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27a0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27b0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
27c0: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
27d0: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
27e0: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
27f0: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2810: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
2820: 6c 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69  le(1){.    for(i
2830: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2840: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2850: 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c       int j = (i<
2860: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
2870: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
2880: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
2890: 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73      if( zDatabas
28a0: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
28b0: 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65  trICmp(zDatabase
28c0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62  , db->aDb[j].zDb
28d0: 53 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  SName)==0 ){.   
28e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
28f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2900: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
2910: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c  .        p = sql
2920: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2930: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2940: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2960: 20 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20   ) return p;.   
2970: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2980: 2a 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66  * Not found.  If
2990: 20 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72   the name we wer
29a0: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61  e looking for wa
29b0: 73 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61  s temp.sqlite_ma
29c0: 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e  ster.    ** then
29d0: 20 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65   change the name
29e0: 20 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f   to sqlite_temp_
29f0: 6d 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61  master and try a
2a00: 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2a10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a20: 7a 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41  zName, MASTER_NA
2a30: 4d 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ME)!=0 ) break;.
2a40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2a50: 73 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73  stricmp(zDatabas
2a60: 65 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44  e, db->aDb[1].zD
2a70: 62 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65  bSName)!=0 ) bre
2a80: 61 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ak;.    zName = 
2a90: 54 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45  TEMP_MASTER_NAME
2aa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2ac0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2ad0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2ae0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2af0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2b00: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2b10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2b20: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2b30: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2b40: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2b50: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2b60: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2b80: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2b90: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2ba0: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2bb0: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2bc0: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2bd0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2be0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2bf0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2c00: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2c10: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2c20: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2c30: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2c40: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2c50: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2c60: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2c70: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2c80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2c90: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2ca0: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2cb0: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2cc0: 20 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20    u32 flags,    
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41           /* LOCA
2ce0: 54 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54  TE_VIEW or LOCAT
2cf0: 45 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e  E_NOERR */.  con
2d00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2d10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2d30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2d50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2d60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2d70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2d80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2d90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2da0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2db0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2dc0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2dd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2de0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2df0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
2e00: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
2e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
2e20: 2e 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e  . */.  if( (db->
2e30: 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41  mDbFlags & DBFLA
2e40: 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29  G_SchemaKnownOk)
2e50: 3d 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54  ==0 .   && SQLIT
2e60: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
2e70: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a  dSchema(pParse).
2e80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e90: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2ea0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
2eb0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65  b, zName, zDbase
2ec0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
2ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2ef0: 45 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  E.    /* If zNam
2f00: 65 20 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65  e is the not the
2f10: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
2f20: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63   in the schema c
2f30: 72 65 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20  reated using.   
2f40: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2f50: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2f60: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2f70: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2f80: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ble that.    ** 
2f90: 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d  can be an eponym
2fa0: 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ous virtual tabl
2fb0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
2fc0: 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56 74 61  arse->disableVta
2fd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 6f  b==0 ){.      Mo
2fe0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2ff0: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
3000: 68 46 69 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75  hFind(&db->aModu
3010: 6c 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le, zName);.    
3020: 20 20 69 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26    if( pMod==0 &&
3030: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
3040: 70 28 7a 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61  p(zName, "pragma
3050: 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
3060: 20 20 20 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69       pMod = sqli
3070: 74 65 33 50 72 61 67 6d 61 56 74 61 62 52 65 67  te3PragmaVtabReg
3080: 69 73 74 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29  ister(db, zName)
3090: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30a0: 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c 69  if( pMod && sqli
30b0: 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73  te3VtabEponymous
30c0: 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73 65  TableInit(pParse
30d0: 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20  , pMod) ){.     
30e0: 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e     return pMod->
30f0: 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d  pEpoTab;.      }
3100: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3110: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4c 4f    if( flags & LO
3120: 43 41 54 45 5f 4e 4f 45 52 52 20 29 20 72 65 74  CATE_NOERR ) ret
3130: 75 72 6e 20 30 3b 0a 20 20 20 20 70 50 61 72 73  urn 0;.    pPars
3140: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
3150: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
3160: 49 73 56 69 72 74 75 61 6c 28 70 29 20 26 26 20  IsVirtual(p) && 
3170: 70 50 61 72 73 65 2d 3e 64 69 73 61 62 6c 65 56  pParse->disableV
3180: 74 61 62 20 29 7b 0a 20 20 20 20 70 20 3d 20 30  tab ){.    p = 0
3190: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 3d 3d  ;.  }..  if( p==
31a0: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
31b0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 66 6c 61 67  har *zMsg = flag
31c0: 73 20 26 20 4c 4f 43 41 54 45 5f 56 49 45 57 20  s & LOCATE_VIEW 
31d0: 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22  ? "no such view"
31e0: 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c   : "no such tabl
31f0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61  e";.    if( zDba
3200: 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  se ){.      sqli
3210: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3220: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
3230: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a   zMsg, zDbase, z
3240: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
3250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3260: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3270: 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20  "%s: %s", zMsg, 
3280: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
3290: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  }..  return p;.}
32a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
32b0: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
32c0: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
32d0: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
32e0: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
32f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
3300: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
3310: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
3320: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
3330: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
3340: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
3350: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
3360: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
3370: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
3380: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
3390: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
33a0: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
33b0: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
33c0: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
33d0: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
33e0: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
33f0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
3400: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
3410: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
3420: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
3430: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
3440: 2a 70 50 61 72 73 65 2c 20 0a 20 20 75 33 32 20  *pParse, .  u32 
3450: 66 6c 61 67 73 2c 0a 20 20 73 74 72 75 63 74 20  flags,.  struct 
3460: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3470: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3480: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3490: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
34a0: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
34b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
34c0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
34d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
34e0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
34f0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
3500: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
3510: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
3520: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 7d  b].zDbSName;.  }
3530: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3540: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3550: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3560: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3570: 61 72 73 65 2c 20 66 6c 61 67 73 2c 20 70 2d 3e  arse, flags, p->
3580: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
3590: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
35a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
35b0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
35c0: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
35d0: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
35e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
35f0: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
3600: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
3610: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
3620: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
3630: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
3640: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
3650: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
3660: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
3670: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
3680: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
3690: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
36a0: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
36b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
36c0: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
36d0: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
36e0: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
36f0: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
3700: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
3710: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
3720: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
3730: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
3740: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
3750: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
3760: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
3770: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
3780: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
3790: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
37a0: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
37b0: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
37c0: 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20  int i;.  /* All 
37d0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
37e0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
37f0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
3800: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
3810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3820: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3830: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3840: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3850: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3860: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3870: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3880: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3890: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
38a0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
38b0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
38c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
38d0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
38e0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
38f0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
3900: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
3910: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53   db->aDb[j].zDbS
3920: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
3930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
3940: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3950: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
3960: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
3970: 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65  3HashFind(&pSche
3980: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
3990: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
39a0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
39b0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
39c0: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
39d0: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
39e0: 6e 64 65 78 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ndex.*/.void sql
39f0: 69 74 65 33 46 72 65 65 49 6e 64 65 78 28 73 71  ite3FreeIndex(sq
3a00: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
3a10: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
3a20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
3a30: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
3a40: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
3a50: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  , p);.#endif.  s
3a60: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3a70: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
3a80: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
3a90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3aa0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29  db, p->aColExpr)
3ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3ac0: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3ad0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3ae0: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3af0: 62 46 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20  bFree(db, (void 
3b00: 2a 29 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69  *)p->azColl);.#i
3b10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3b20: 4c 45 5f 53 54 41 54 34 0a 20 20 73 71 6c 69 74  LE_STAT4.  sqlit
3b30: 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 52 6f 77  e3_free(p->aiRow
3b40: 45 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  Est);.#endif.  s
3b50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3b60: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f   p);.}../*.** Fo
3b70: 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c  r the index call
3b80: 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63  ed zIdxName whic
3b90: 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68  h is found in th
3ba0: 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a  e database iDb,.
3bb0: 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69  ** unlike that i
3bc0: 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61  ndex from its Ta
3bd0: 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  ble then remove 
3be0: 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a  the index from.*
3bf0: 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68  * the index hash
3c00: 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20   table and free 
3c10: 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  all memory struc
3c20: 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64  tures associated
3c30: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64  .** with the ind
3c40: 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ex..*/.void sqli
3c50: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
3c60: 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  teIndex(sqlite3 
3c70: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
3c80: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61  nst char *zIdxNa
3c90: 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  me){.  Index *pI
3ca0: 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a 70 48  ndex;.  Hash *pH
3cb0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
3cc0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3cd0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3ce0: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3cf0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3d00: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3d10: 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
3d20: 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  e3HashInsert(pHa
3d30: 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 30 29  sh, zIdxName, 0)
3d40: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
3d50: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 69 66  Index) ){.    if
3d60: 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ( pIndex->pTable
3d70: 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78  ->pIndex==pIndex
3d80: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
3d90: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
3da0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3dc0: 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
3dd0: 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63 61 74     /* Justificat
3de0: 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28 29 3b  ion of ALWAYS();
3df0: 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75 73 74    The index must
3e00: 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 20   be on the list 
3e10: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64 69  of.      ** indi
3e20: 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20  ces. */.      p 
3e30: 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
3e40: 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
3e50: 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 29  while( ALWAYS(p)
3e60: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
3e70: 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70  ndex ){ p = p->p
3e80: 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20 69 66  Next; }.      if
3e90: 28 20 41 4c 57 41 59 53 28 70 20 26 26 20 70 2d  ( ALWAYS(p && p-
3ea0: 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 29 20  >pNext==pIndex) 
3eb0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3ec0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3ed0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3ee0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 72   }.    sqlite3Fr
3ef0: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3f00: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d  ex);.  }.  db->m
3f10: 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41  DbFlags |= DBFLA
3f20: 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  G_SchemaChange;.
3f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
3f40: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
3f50: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
3f60: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
3f70: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3f80: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3f90: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3fa0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3fb0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3fc0: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3fd0: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3fe0: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3ff0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
4000: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
4010: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
4020: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
4030: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
4040: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
4050: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
4060: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
4070: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
4080: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
4090: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
40a0: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
40b0: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
40c0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
40d0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
40e0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
40f0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
4100: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4110: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 44 62 53 4e  e(db, pDb->zDbSN
4120: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
4130: 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 30 3b 0a 20  >zDbSName = 0;. 
4140: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69     }.    if( j<i
4160: 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   ){.      db->aD
4170: 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  b[j] = db->aDb[i
4180: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b  ];.    }.    j++
4190: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 44 62 20  ;.  }.  db->nDb 
41a0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
41b0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
41c0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
41d0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
41e0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
41f0: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4200: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4220: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4230: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4240: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4250: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4260: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4270: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4280: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
4290: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
42a0: 63 68 65 6d 61 2e 20 20 54 68 65 20 72 65 73 65  chema.  The rese
42b0: 74 20 69 73 20 64 65 66 65 72 72 65 64 20 69 66  t is deferred if
42c0: 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b   db->nSchemaLock
42d0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2e 0a 2a 2a   is not zero..**
42e0: 20 44 65 66 65 72 72 65 64 20 72 65 73 65 74 73   Deferred resets
42f0: 20 6d 61 79 20 62 65 20 72 75 6e 20 62 79 20 63   may be run by c
4300: 61 6c 6c 69 6e 67 20 77 69 74 68 20 69 44 62 3c  alling with iDb<
4310: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
4320: 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d 61  e3ResetOneSchema
4330: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4340: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 69 3b  t iDb){.  int i;
4350: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64  .  assert( iDb<d
4360: 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28  b->nDb );..  if(
4370: 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
4380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4390: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
43a0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
43b0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64   DbSetProperty(d
43c0: 62 2c 20 69 44 62 2c 20 44 42 5f 52 65 73 65 74  b, iDb, DB_Reset
43d0: 57 61 6e 74 65 64 29 3b 0a 20 20 20 20 44 62 53  Wanted);.    DbS
43e0: 65 74 50 72 6f 70 65 72 74 79 28 64 62 2c 20 31  etProperty(db, 1
43f0: 2c 20 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64  , DB_ResetWanted
4400: 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  );.    db->mDbFl
4410: 61 67 73 20 26 3d 20 7e 44 42 46 4c 41 47 5f 53  ags &= ~DBFLAG_S
4420: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 3b 0a 20 20  chemaKnownOk;.  
4430: 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63  }..  if( db->nSc
4440: 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  hemaLock==0 ){. 
4450: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
4460: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4470: 20 20 20 69 66 28 20 44 62 48 61 73 50 72 6f 70     if( DbHasProp
4480: 65 72 74 79 28 64 62 2c 20 69 2c 20 44 42 5f 52  erty(db, i, DB_R
4490: 65 73 65 74 57 61 6e 74 65 64 29 20 29 7b 0a 20  esetWanted) ){. 
44a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63         sqlite3Sc
44b0: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
44c0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[i].pSchema);. 
44d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
44e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
44f0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
4500: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
4510: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
4520: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
4530: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
4540: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
4550: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4560: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4570: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
4580: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
4590: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
45a0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
45b0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
45c0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
45d0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
45e0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
45f0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
4600: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
4610: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  ){.      if( db-
4620: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20  >nSchemaLock==0 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4640: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
4650: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
4660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4670: 20 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28    DbSetProperty(
4680: 64 62 2c 20 69 2c 20 44 42 5f 52 65 73 65 74 57  db, i, DB_ResetW
4690: 61 6e 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  anted);.      }.
46a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
46b0: 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42  mDbFlags &= ~(DB
46c0: 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67  FLAG_SchemaChang
46d0: 65 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b  e|DBFLAG_SchemaK
46e0: 6e 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74  nownOk);.  sqlit
46f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
4700: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
4710: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
4720: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 63 68  ;.  if( db->nSch
4730: 65 6d 61 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  emaLock==0 ){.  
4740: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
4750: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
4760: 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
4770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4780: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
4790: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
47a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
47b0: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
47c0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
47d0: 0a 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20  .  db->mDbFlags 
47e0: 26 3d 20 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d  &= ~DBFLAG_Schem
47f0: 61 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  aChange;.}../*.*
4800: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4810: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4820: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4830: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4840: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4850: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4860: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4870: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4880: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
4890: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
48a0: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
48b0: 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  pCol;.  assert( 
48c0: 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69  pTable!=0 );.  i
48d0: 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c  f( (pCol = pTabl
48e0: 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  e->aCol)!=0 ){. 
48f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
4900: 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  able->nCol; i++,
4910: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
4920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4930: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
4940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
4950: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
4960: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
4970: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4980: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
49a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
49b0: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
49c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
49d0: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
49e0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
49f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
4a00: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
4a10: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
4a20: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
4a30: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
4a40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
4a50: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4a60: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4a70: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4a80: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4a90: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4aa0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4ab0: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4ac0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4ad0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4ae0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4af0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
4b00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
4b10: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
4b20: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
4b30: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
4b40: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
4b50: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4b60: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4b70: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4b80: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4b90: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4ba0: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4bb0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4bc0: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4bd0: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4be0: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4bf0: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
4c00: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
4c10: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4c20: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
4c30: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
4c40: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
4c50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4c60: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
4c70: 4e 45 20 64 65 6c 65 74 65 54 61 62 6c 65 28 73  NE deleteTable(s
4c80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4c90: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4ca0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4cb0: 65 78 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ext;..#ifdef SQL
4cc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52  ITE_DEBUG.  /* R
4cd0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4ce0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4cf0: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4d00: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4d10: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4d20: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4d30: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4d40: 2e 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54  . Since schema T
4d50: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65  ables do not use
4d60: 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c  .  ** lookaside,
4d70: 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f   this number sho
4d80: 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  uld not change. 
4d90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6d 61  .  **.  ** If ma
4da0: 6c 6c 6f 63 20 68 61 73 20 61 6c 72 65 61 64 79  lloc has already
4db0: 20 66 61 69 6c 65 64 2c 20 69 74 20 6d 61 79 20   failed, it may 
4dc0: 62 65 20 74 68 61 74 20 69 74 20 66 61 69 6c 65  be that it faile
4dd0: 64 20 77 68 69 6c 65 20 61 6c 6c 6f 63 61 74 69  d while allocati
4de0: 6e 67 0a 20 20 2a 2a 20 61 20 54 61 62 6c 65 20  ng.  ** a Table 
4df0: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61 73 20  object that was 
4e00: 67 6f 69 6e 67 20 74 6f 20 62 65 20 6d 61 72 6b  going to be mark
4e10: 65 64 20 65 70 68 65 6d 65 72 61 6c 2e 20 53 6f  ed ephemeral. So
4e20: 20 64 6f 20 6e 6f 74 20 63 68 65 63 6b 0a 20 20   do not check.  
4e30: 2a 2a 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  ** that no looka
4e40: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
4e50: 73 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  sed in this case
4e60: 20 65 69 74 68 65 72 2e 20 2a 2f 0a 20 20 69 6e   either. */.  in
4e70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 30  t nLookaside = 0
4e80: 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 64  ;.  if( db && !d
4e90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4ea0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
4eb0: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4ec0: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  ral)==0 ){.    n
4ed0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69  Lookaside = sqli
4ee0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64  te3LookasideUsed
4ef0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  (db, 0);.  }.#en
4f00: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
4f10: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4f20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
4f30: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
4f40: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
4f50: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
4f60: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
4f70: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
4f80: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4f90: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4fa0: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4fb0: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20  ->pSchema.      
4fc0: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c     || (IsVirtual
4fd0: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64  (pTable) && pInd
4fe0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
4ff0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
5000: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  EF) );.    if( (
5010: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
5020: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
5030: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
5040: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  le) ){.      cha
5050: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65  r *zName = pInde
5060: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20  x->zName; .     
5070: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65   TESTONLY ( Inde
5080: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69  x *pOld = ) sqli
5090: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20  te3HashInsert(. 
50a0: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d          &pIndex-
50b0: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
50c0: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20  h, zName, 0.    
50d0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
50e0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
50f0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
5100: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
5110: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
5120: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
5130: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
5140: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
5150: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65   sqlite3FreeInde
5160: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
5170: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
5180: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
5190: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
51a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
51b0: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
51c0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
51d0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
51e0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
51f0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
5200: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  e3DeleteColumnNa
5210: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  mes(db, pTable);
5220: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5230: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  (db, pTable->zNa
5240: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5250: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
5260: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c  >zColAff);.  sql
5270: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
5280: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
5290: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  lect);.  sqlite3
52a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
52b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
52c0: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  k);.#ifndef SQLI
52d0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
52e0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
52f0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
5300: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
5310: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5320: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
5330: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
5340: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
5350: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
5360: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
5370: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
5380: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
5390: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73  e==sqlite3Lookas
53a0: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b  ideUsed(db,0) );
53b0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  .}.void sqlite3D
53c0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
53d0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
53e0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20  Table){.  /* Do 
53f0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
5400: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
5410: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
5420: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
5430: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
5440: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
5450: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
5460: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
5470: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65  --pTable->nTabRe
5480: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  f)>0) ) return;.
5490: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62    deleteTable(db
54a0: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f  , pTable);.}.../
54b0: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
54c0: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
54d0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
54e0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
54f0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
5500: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
5510: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
5520: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
5530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
5540: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
5550: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
5560: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
5570: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
5580: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
5590: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
55a0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
55b0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
55c0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
55d0: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
55e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
55f0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
5600: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
5610: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
5620: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
5630: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
5640: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
5650: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
5660: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
5670: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
5680: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
5690: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
56a0: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b  h, zTabName, 0);
56b0: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
56c0: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20  Table(db, p);.  
56d0: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
56e0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
56f0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  nge;.}../*.** Gi
5700: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
5710: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
5720: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
5730: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
5740: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
5750: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
5760: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
5770: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
5780: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
5790: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
57a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
57b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
57c0: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
57d0: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
57e0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
57f0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
5800: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
5810: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
5820: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
5830: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
5840: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
5850: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
5860: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
5870: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
5880: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
5890: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
58a0: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
58b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
58c0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
58d0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
58e0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
58f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
5900: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
5910: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
5920: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
5930: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
5940: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
5950: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5960: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5970: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5980: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5990: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
59a0: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
59b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
59c0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
59d0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
59e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
59f0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
5a00: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
5a10: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
5a20: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
5a30: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
5a40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
5a50: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5a60: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5a70: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5a80: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5a90: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5aa0: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5ab0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53  TER_ROOT, 1, MAS
5ac0: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c  TER_NAME);.  sql
5ad0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
5ae0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  t(v, OP_OpenWrit
5af0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  e, 0, MASTER_ROO
5b00: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66  T, iDb, 5);.  if
5b10: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
5b20: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
5b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
5b40: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
5b50: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
5b60: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
5b70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
5b80: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
5b90: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
5ba0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5bb0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5bc0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
5bd0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5be0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
5bf0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
5c00: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
5c10: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
5c20: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
5c30: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
5c40: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
5c50: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
5c60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
5c70: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
5c80: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5c90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
5ca0: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
5cb0: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28  b *pDb;.    for(
5cc0: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5cd0: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5ce0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5cf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
5d00: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5d10: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
5d20: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Name) ) break;. 
5d30: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69       /* "main" i
5d40: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65  s always an acce
5d50: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72  ptable alias for
5d60: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74   the primary dat
5d70: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65  abase.      ** e
5d80: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65  ven if it has be
5d90: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67  en renamed using
5da0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
5db0: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a  _MAINDBNAME. */.
5dc0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
5dd0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
5de0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61  icmp("main", zNa
5df0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  me) ) break;.   
5e00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5e10: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
5e20: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
5e30: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
5e40: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
5e50: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
5e60: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5e70: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5e80: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5e90: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5ea0: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5eb0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5ec0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5ed0: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5ee0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5ef0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5f00: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
5f10: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
5f20: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
5f30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5f60: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5f70: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f90: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5fa0: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5fb0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5fc0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5fd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5fe0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5ff0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
6000: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6010: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
6020: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
6030: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
6040: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
6050: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
6060: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
6070: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
6080: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
6090: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
60a0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
60b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
60c0: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
60d0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
60e0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
60f0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
6100: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
6110: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
6120: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
6130: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
6140: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6150: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
6160: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
6170: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
6180: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6190: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
61a0: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
61c0: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
61d0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
61e0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
61f0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
6200: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6210: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6220: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
6230: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
6240: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
6250: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
6260: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
6270: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
6280: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
6290: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
62a0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
62b0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
62c0: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
62d0: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
62e0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
62f0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
6300: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
6310: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
6320: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
6330: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
6340: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
6350: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
6360: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
6370: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
6380: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
63a0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
63b0: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
63c0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
63d0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
63e0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29  ert( pName2!=0 )
63f0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e  ;.  if( pName2->
6400: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  n>0 ){.    if( d
6410: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b  b->init.busy ) {
6420: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6430: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6440: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
6450: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
6470: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
6480: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
6490: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
64a0: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
64b0: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
64c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
64d0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
64e0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
64f0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  me1);.      retu
6500: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
6510: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
6520: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6530: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 || db->init.bu
6540: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f  sy || IN_RENAME_
6550: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20  OBJECT.         
6560: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46      || (db->mDbF
6570: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61  lags & DBFLAG_Va
6580: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69  cuum)!=0);.    i
6590: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44  Db = db->init.iD
65a0: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  b;.    *pUnqual 
65b0: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20  = pName1;.  }.  
65c0: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f  return iDb;.}../
65d0: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 50 52 41  *.** True if PRA
65e0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
65f0: 65 6d 61 20 69 73 20 4f 4e 0a 2a 2f 0a 69 6e 74  ema is ON.*/.int
6600: 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65   sqlite3Writable
6610: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
6620: 64 62 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  db){.  testcase(
6630: 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51 4c   (db->flags&(SQL
6640: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 7c  ITE_WriteSchema|
6650: 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
6660: 29 29 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  ))==0 );.  testc
6670: 61 73 65 28 20 28 64 62 2d 3e 66 6c 61 67 73 26  ase( (db->flags&
6680: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6690: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
66a0: 73 69 76 65 29 29 3d 3d 0a 20 20 20 20 20 20 20  sive))==.       
66b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
66c0: 72 69 74 65 53 63 68 65 6d 61 20 29 3b 0a 20 20  riteSchema );.  
66d0: 74 65 73 74 63 61 73 65 28 20 28 64 62 2d 3e 66  testcase( (db->f
66e0: 6c 61 67 73 26 28 53 51 4c 49 54 45 5f 57 72 69  lags&(SQLITE_Wri
66f0: 74 65 53 63 68 65 6d 61 7c 53 51 4c 49 54 45 5f  teSchema|SQLITE_
6700: 44 65 66 65 6e 73 69 76 65 29 29 3d 3d 0a 20 20  Defensive))==.  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
6720: 49 54 45 5f 44 65 66 65 6e 73 69 76 65 20 29 3b  ITE_Defensive );
6730: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 64 62  .  testcase( (db
6740: 2d 3e 66 6c 61 67 73 26 28 53 51 4c 49 54 45 5f  ->flags&(SQLITE_
6750: 57 72 69 74 65 53 63 68 65 6d 61 7c 53 51 4c 49  WriteSchema|SQLI
6760: 54 45 5f 44 65 66 65 6e 73 69 76 65 29 29 3d 3d  TE_Defensive))==
6770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6780: 28 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68  (SQLITE_WriteSch
6790: 65 6d 61 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e  ema|SQLITE_Defen
67a0: 73 69 76 65 29 20 29 3b 0a 20 20 72 65 74 75 72  sive) );.  retur
67b0: 6e 20 28 64 62 2d 3e 66 6c 61 67 73 26 28 53 51  n (db->flags&(SQ
67c0: 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61  LITE_WriteSchema
67d0: 7c 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76  |SQLITE_Defensiv
67e0: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 57 72 69 74  e))==SQLITE_Writ
67f0: 65 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eSchema;.}../*.*
6800: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
6810: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
6820: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
6830: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
6840: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
6850: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
6860: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6870: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6880: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6890: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
68a0: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
68b0: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
68c0: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
68d0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
68e0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
68f0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6900: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
6910: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
6920: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
6930: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2a  internal use..**
6940: 0a 2a 2a 20 57 68 65 6e 20 70 61 72 73 69 6e 67  .** When parsing
6950: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
6960: 65 72 20 74 61 62 6c 65 2c 20 74 68 69 73 20 72  er table, this r
6970: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 63 68 65 63  outine also chec
6980: 6b 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  ks to.** make su
6990: 72 65 20 74 68 65 20 22 74 79 70 65 22 2c 20 22  re the "type", "
69a0: 6e 61 6d 65 22 2c 20 61 6e 64 20 22 74 62 6c 5f  name", and "tbl_
69b0: 6e 61 6d 65 22 20 63 6f 6c 75 6d 6e 73 20 61 72  name" columns ar
69c0: 65 20 63 6f 6e 73 69 73 74 65 6e 74 0a 2a 2a 20  e consistent.** 
69d0: 77 69 74 68 20 74 68 65 20 53 51 4c 2e 0a 2a 2f  with the SQL..*/
69e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
69f0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 0a 20 20 50  kObjectName(.  P
6a00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
6a20: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
6a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6a40: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
6a50: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  me of the object
6a60: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63   to check */.  c
6a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
6a80: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65  ,        /* Type
6a90: 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20   of this object 
6aa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6ab0: 2a 7a 54 62 6c 4e 61 6d 65 20 20 20 20 20 20 2f  *zTblName      /
6ac0: 2a 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 6e  * Parent table n
6ad0: 61 6d 65 20 66 6f 72 20 74 72 69 67 67 65 72 73  ame for triggers
6ae0: 20 61 6e 64 20 69 6e 64 65 78 65 73 20 2a 2f 0a   and indexes */.
6af0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6b00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6b10: 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74   if( sqlite3Writ
6b20: 61 62 6c 65 53 63 68 65 6d 61 28 64 62 29 20 7c  ableSchema(db) |
6b30: 7c 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  | db->init.impos
6b40: 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  terTable ){.    
6b50: 2f 2a 20 53 6b 69 70 20 74 68 65 73 65 20 65 72  /* Skip these er
6b60: 72 6f 72 20 63 68 65 63 6b 73 20 66 6f 72 20 77  ror checks for w
6b70: 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
6b80: 4e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  N */.    return 
6b90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
6ba0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
6bb0: 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  sy ){.    if( sq
6bc0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
6bd0: 79 70 65 2c 20 64 62 2d 3e 69 6e 69 74 2e 61 7a  ype, db->init.az
6be0: 49 6e 69 74 5b 30 5d 29 0a 20 20 20 20 20 7c 7c  Init[0]).     ||
6bf0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
6c00: 28 7a 4e 61 6d 65 2c 20 64 62 2d 3e 69 6e 69 74  (zName, db->init
6c10: 2e 61 7a 49 6e 69 74 5b 31 5d 29 0a 20 20 20 20  .azInit[1]).    
6c20: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
6c30: 63 6d 70 28 7a 54 62 6c 4e 61 6d 65 2c 20 64 62  cmp(zTblName, db
6c40: 2d 3e 69 6e 69 74 2e 61 7a 49 6e 69 74 5b 32 5d  ->init.azInit[2]
6c50: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
6c60: 66 28 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67  f( sqlite3Config
6c70: 2e 62 45 78 74 72 61 53 63 68 65 6d 61 43 68 65  .bExtraSchemaChe
6c80: 63 6b 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  cks ){.        s
6c90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6ca0: 50 61 72 73 65 2c 20 22 22 29 3b 20 2f 2a 20 63  Parse, ""); /* c
6cb0: 6f 72 72 75 70 74 53 63 68 65 6d 61 28 29 20 77  orruptSchema() w
6cc0: 69 6c 6c 20 73 75 70 70 6c 79 20 74 68 65 20 65  ill supply the e
6cd0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
6ce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
6cf0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
6d00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6d10: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
6d20: 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 30  ed==0 .     && 0
6d30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6d40: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6d50: 5f 22 2c 20 37 29 0a 20 20 20 20 29 7b 0a 20 20  _", 7).    ){.  
6d60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6d70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
6d80: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
6d90: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
6da0: 73 65 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  se: %s",.       
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
6dc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
6dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6e10: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
6e20: 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65  index of a table
6e30: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
6e40: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
6e50: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  x(Table *pTab){.
6e60: 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f    Index *p;.  fo
6e70: 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  r(p=pTab->pIndex
6e80: 3b 20 70 20 26 26 20 21 49 73 50 72 69 6d 61 72  ; p && !IsPrimar
6e90: 79 4b 65 79 49 6e 64 65 78 28 70 29 3b 20 70 3d  yKeyIndex(p); p=
6ea0: 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65  p->pNext){}.  re
6eb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6ec0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 74 61 62 6c   Convert an tabl
6ed0: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
6ee0: 69 6e 74 6f 20 61 20 69 6e 64 65 78 20 63 6f 6c  into a index col
6ef0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 54 68 61  umn number.  Tha
6f00: 74 20 69 73 2c 0a 2a 2a 20 66 6f 72 20 74 68 65  t is,.** for the
6f10: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 69 6e 20   column iCol in 
6f20: 74 68 65 20 74 61 62 6c 65 20 28 61 73 20 64 65  the table (as de
6f30: 66 69 6e 65 64 20 62 79 20 74 68 65 20 43 52 45  fined by the CRE
6f40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6f50: 65 6e 74 29 0a 2a 2a 20 66 69 6e 64 20 74 68 65  ent).** find the
6f60: 20 28 66 69 72 73 74 29 20 6f 66 66 73 65 74 20   (first) offset 
6f70: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
6f80: 6e 20 69 6e 64 65 78 20 70 49 64 78 2e 20 20 4f  n index pIdx.  O
6f90: 72 20 72 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69  r return -1.** i
6fa0: 66 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 69 73  f column iCol is
6fb0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 69 6e 64   not used in ind
6fc0: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 69 31 36 20  ex pIdx..*/.i16 
6fd0: 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f 6c 75  sqlite3TableColu
6fe0: 6d 6e 54 6f 49 6e 64 65 78 28 49 6e 64 65 78 20  mnToIndex(Index 
6ff0: 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29  *pIdx, i16 iCol)
7000: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
7010: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
7020: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
7030: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d   if( iCol==pIdx-
7040: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72  >aiColumn[i] ) r
7050: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
7060: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 23 69 66  eturn -1;.}..#if
7070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7080: 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d  _GENERATED_COLUM
7090: 4e 53 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20  NS./* Convert a 
70a0: 73 74 6f 72 61 67 65 20 63 6f 6c 75 6d 6e 20 6e  storage column n
70b0: 75 6d 62 65 72 20 69 6e 74 6f 20 61 20 74 61 62  umber into a tab
70c0: 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  le column number
70d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f 72  ..**.** The stor
70e0: 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  age column numbe
70f0: 72 20 28 30 2c 31 2c 32 2c 2e 2e 2e 2e 29 20 69  r (0,1,2,....) i
7100: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
7110: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 61 73 20 69  he value.** as i
7120: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
7130: 20 72 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b 2e   record on disk.
7140: 20 20 54 68 65 20 74 72 75 65 20 63 6f 6c 75 6d    The true colum
7150: 6e 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 73 20 74  n number.** is t
7160: 68 65 20 69 6e 64 65 78 20 28 30 2c 31 2c 32 2c  he index (0,1,2,
7170: 2e 2e 2e 29 20 6f 66 20 74 68 65 20 63 6f 6c 75  ...) of the colu
7180: 6d 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  mn in the CREATE
7190: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
71a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f 72  ..**.** The stor
71b0: 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  age column numbe
71c0: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  r is less than t
71d0: 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
71e0: 6e 75 6d 62 65 72 20 69 66 0a 2a 2a 20 61 6e 64  number if.** and
71f0: 20 6f 6e 6c 79 20 74 68 65 72 65 20 61 72 65 20   only there are 
7200: 56 49 52 54 55 41 4c 20 63 6f 6c 75 6d 6e 73 20  VIRTUAL columns 
7210: 74 6f 20 74 68 65 20 6c 65 66 74 2e 0a 2a 2a 0a  to the left..**.
7220: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ** If SQLITE_OMI
7230: 54 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55  T_GENERATED_COLU
7240: 4d 4e 53 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  MNS, this routin
7250: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6d 61 63  e is a no-op mac
7260: 72 6f 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  ro..*/.i16 sqlit
7270: 65 33 53 74 6f 72 61 67 65 43 6f 6c 75 6d 6e 54  e3StorageColumnT
7280: 6f 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54  oTable(Table *pT
7290: 61 62 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  ab, i16 iCol){. 
72a0: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
72b0: 61 67 73 20 26 20 54 46 5f 48 61 73 56 69 72 74  ags & TF_HasVirt
72c0: 75 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ual ){.    int i
72d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
72e0: 3c 3d 69 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <=iCol; i++){.  
72f0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43      if( pTab->aC
7300: 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26  ol[i].colFlags &
7310: 20 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c   COLFLAG_VIRTUAL
7320: 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d   ) iCol++;.    }
7330: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 43  .  }.  return iC
7340: 6f 6c 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ol;.}.#endif..#i
7350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7360: 54 5f 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55  T_GENERATED_COLU
7370: 4d 4e 53 0a 2f 2a 20 43 6f 6e 76 65 72 74 20 61  MNS./* Convert a
7380: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 75   table column nu
7390: 6d 62 65 72 20 69 6e 74 6f 20 61 20 73 74 6f 72  mber into a stor
73a0: 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  age column numbe
73b0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 6f  r..**.** The sto
73c0: 72 61 67 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  rage column numb
73d0: 65 72 20 28 30 2c 31 2c 32 2c 2e 2e 2e 2e 29 20  er (0,1,2,....) 
73e0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
73f0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 61 73 20  the value.** as 
7400: 69 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  it appears in th
7410: 65 20 72 65 63 6f 72 64 20 6f 6e 20 64 69 73 6b  e record on disk
7420: 2e 20 20 4f 72 2c 20 69 66 20 74 68 65 20 69 6e  .  Or, if the in
7430: 70 75 74 20 63 6f 6c 75 6d 6e 20 69 73 0a 2a 2a  put column is.**
7440: 20 74 68 65 20 4e 2d 74 68 20 76 69 72 74 75 61   the N-th virtua
7450: 6c 20 63 6f 6c 75 6d 6e 20 28 7a 65 72 6f 2d 62  l column (zero-b
7460: 61 73 65 64 29 20 74 68 65 6e 20 74 68 65 20 73  ased) then the s
7470: 74 6f 72 61 67 65 20 6e 75 6d 62 65 72 20 69 73  torage number is
7480: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
7490: 66 20 6e 6f 6e 2d 76 69 72 74 75 61 6c 20 63 6f  f non-virtual co
74a0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
74b0: 6c 65 20 70 6c 75 73 20 4e 2e 20 20 0a 2a 2a 0a  le plus N.  .**.
74c0: 2a 2a 20 54 68 65 20 74 72 75 65 20 63 6f 6c 75  ** The true colu
74d0: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65  mn number is the
74e0: 20 69 6e 64 65 78 20 28 30 2c 31 2c 32 2c 2e 2e   index (0,1,2,..
74f0: 2e 29 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  .) of the column
7500: 20 69 6e 0a 2a 2a 20 74 68 65 20 43 52 45 41 54   in.** the CREAT
7510: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
7520: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
7530: 69 6e 70 75 74 20 63 6f 6c 75 6d 6e 20 69 73 20  input column is 
7540: 61 20 56 49 52 54 55 41 4c 20 63 6f 6c 75 6d 6e  a VIRTUAL column
7550: 2c 20 74 68 65 6e 20 69 74 20 73 68 6f 75 6c 64  , then it should
7560: 20 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20 69   not appear.** i
7570: 6e 20 73 74 6f 72 61 67 65 2e 20 20 42 75 74 20  n storage.  But 
7580: 74 68 65 20 76 61 6c 75 65 20 73 6f 6d 65 74 69  the value someti
7590: 6d 65 73 20 69 73 20 63 61 63 68 65 64 20 69 6e  mes is cached in
75a0: 20 72 65 67 69 73 74 65 72 73 20 74 68 61 74 0a   registers that.
75b0: 2a 2a 20 66 6f 6c 6c 6f 77 20 74 68 65 20 72 61  ** follow the ra
75c0: 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
75d0: 20 75 73 65 64 20 74 6f 20 63 6f 6e 73 74 72 75   used to constru
75e0: 63 74 20 73 74 6f 72 61 67 65 2e 20 20 54 68 69  ct storage.  Thi
75f0: 73 0a 2a 2a 20 61 76 6f 69 64 73 20 63 6f 6d 70  s.** avoids comp
7600: 75 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 56  uting the same V
7610: 49 52 54 55 41 4c 20 63 6f 6c 75 6d 6e 20 6d 75  IRTUAL column mu
7620: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 61 6e  ltiple times, an
7630: 64 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 76 61  d provides.** va
7640: 6c 75 65 73 20 66 6f 72 20 75 73 65 20 62 79 20  lues for use by 
7650: 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64 65 73  OP_Param opcodes
7660: 20 69 6e 20 74 72 69 67 67 65 72 73 2e 20 20 48   in triggers.  H
7670: 65 6e 63 65 2c 20 69 66 20 74 68 65 0a 2a 2a 20  ence, if the.** 
7680: 69 6e 70 75 74 20 63 6f 6c 75 6d 6e 20 69 73 20  input column is 
7690: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 2c  a VIRTUAL table,
76a0: 20 70 75 74 20 69 74 20 61 66 74 65 72 20 61 6c   put it after al
76b0: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6c 75  l the other colu
76c0: 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  mns..**.** In th
76d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 2c 20 4e 20 6d  e following, N m
76e0: 65 61 6e 73 20 22 6e 6f 72 6d 61 6c 20 63 6f 6c  eans "normal col
76f0: 75 6d 6e 22 2c 20 53 20 6d 65 61 6e 73 20 53 54  umn", S means ST
7700: 4f 52 45 44 2c 20 61 6e 64 0a 2a 2a 20 56 20 6d  ORED, and.** V m
7710: 65 61 6e 73 20 56 49 52 54 55 41 4c 2e 20 20 53  eans VIRTUAL.  S
7720: 75 70 70 6f 73 65 20 74 68 65 20 43 52 45 41 54  uppose the CREAT
7730: 45 20 54 41 42 4c 45 20 68 61 73 20 63 6f 6c 75  E TABLE has colu
7740: 6d 6e 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  mns like this:.*
7750: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 43 52 45 41  *.**        CREA
7760: 54 45 20 54 41 42 4c 45 20 65 78 28 4e 2c 53 2c  TE TABLE ex(N,S,
7770: 56 2c 4e 2c 53 2c 56 2c 4e 2c 53 2c 56 29 3b 0a  V,N,S,V,N,S,V);.
7780: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
7790: 20 20 20 20 20 20 20 2d 2d 20 30 20 31 20 32 20         -- 0 1 2 
77a0: 33 20 34 20 35 20 36 20 37 20 38 0a 2a 2a 0a 2a  3 4 5 6 7 8.**.*
77b0: 2a 20 54 68 65 6e 20 74 68 65 20 6d 61 70 70 69  * Then the mappi
77c0: 6e 67 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ng from this fun
77d0: 63 74 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ction is as foll
77e0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e  ows:.**.**    IN
77f0: 50 55 54 53 3a 20 20 20 20 20 30 20 31 20 32 20  PUTS:     0 1 2 
7800: 33 20 34 20 35 20 36 20 37 20 38 0a 2a 2a 20 20  3 4 5 6 7 8.**  
7810: 20 20 4f 55 54 50 55 54 53 3a 20 20 20 20 30 20    OUTPUTS:    0 
7820: 31 20 36 20 32 20 33 20 37 20 34 20 35 20 38 0a  1 6 2 3 7 4 5 8.
7830: 2a 2a 0a 2a 2a 20 53 6f 2c 20 69 6e 20 6f 74 68  **.** So, in oth
7840: 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 20 72  er words, this r
7850: 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 61 6c  outine shifts al
7860: 6c 20 74 68 65 20 76 69 72 74 75 61 6c 20 63 6f  l the virtual co
7870: 6c 75 6d 6e 73 20 74 6f 0a 2a 2a 20 74 68 65 20  lumns to.** the 
7880: 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  end..**.** If SQ
7890: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41  LITE_OMIT_GENERA
78a0: 54 45 44 5f 43 4f 4c 55 4d 4e 53 20 74 68 65 6e  TED_COLUMNS then
78b0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 76 69   there are no vi
78c0: 72 74 75 61 6c 20 63 6f 6c 75 6d 6e 73 20 61 6e  rtual columns an
78d0: 64 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  d.** this routin
78e0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6d 61 63  e is a no-op mac
78f0: 72 6f 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74  ro..*/.i16 sqlit
7900: 65 33 54 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 53  e3TableColumnToS
7910: 74 6f 72 61 67 65 28 54 61 62 6c 65 20 2a 70 54  torage(Table *pT
7920: 61 62 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20  ab, i16 iCol){. 
7930: 20 69 6e 74 20 69 3b 0a 20 20 69 31 36 20 6e 3b   int i;.  i16 n;
7940: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3c  .  assert( iCol<
7950: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
7960: 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
7970: 61 67 73 20 26 20 54 46 5f 48 61 73 56 69 72 74  ags & TF_HasVirt
7980: 75 61 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ual)==0 ) return
7990: 20 69 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30   iCol;.  for(i=0
79a0: 2c 20 6e 3d 30 3b 20 69 3c 69 43 6f 6c 3b 20 69  , n=0; i<iCol; i
79b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 70 54  ++){.    if( (pT
79c0: 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46  ab->aCol[i].colF
79d0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56  lags & COLFLAG_V
79e0: 49 52 54 55 41 4c 29 3d 3d 30 20 29 20 6e 2b 2b  IRTUAL)==0 ) n++
79f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
7a00: 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c 61  ->aCol[i].colFla
7a10: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 56 49 52  gs & COLFLAG_VIR
7a20: 54 55 41 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 69  TUAL ){.    /* i
7a30: 43 6f 6c 20 69 73 20 61 20 76 69 72 74 75 61 6c  Col is a virtual
7a40: 20 63 6f 6c 75 6d 6e 20 69 74 73 65 6c 66 20 2a   column itself *
7a50: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 54 61  /.    return pTa
7a60: 62 2d 3e 6e 4e 56 43 6f 6c 20 2b 20 69 20 2d 20  b->nNVCol + i - 
7a70: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
7a80: 2f 2a 20 69 43 6f 6c 20 69 73 20 61 20 6e 6f 72  /* iCol is a nor
7a90: 6d 61 6c 20 6f 72 20 73 74 6f 72 65 64 20 63 6f  mal or stored co
7aa0: 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75  lumn */.    retu
7ab0: 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  rn n;.  }.}.#end
7ac0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  if../*.** Begin 
7ad0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
7ae0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
7af0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
7b00: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
7b10: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
7b20: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
7b30: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
7b40: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
7b50: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
7b60: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7b70: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
7b80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7b90: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
7ba0: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
7bb0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
7bc0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
7bd0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
7be0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
7bf0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
7c00: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
7c10: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
7c20: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
7c30: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
7c40: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7c50: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
7c60: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
7c70: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
7c80: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
7c90: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
7ca0: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
7cb0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
7cc0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
7cd0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
7ce0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
7cf0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
7d00: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
7d10: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
7d20: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
7d30: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
7d40: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
7d50: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
7d60: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
7d70: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
7d80: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
7d90: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
7da0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
7db0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
7dc0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
7dd0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
7de0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
7df0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
7e00: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
7e10: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
7e20: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
7e30: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
7e40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7e50: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
7e60: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
7e70: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
7e80: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
7e90: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
7ea0: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
7eb0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
7ec0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
7ed0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7ee0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
7ef0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
7f00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
7f10: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
7f20: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
7f30: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
7f40: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
7f50: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
7f60: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
7f70: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
7f80: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
7f90: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
7fa0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
7fb0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
7fc0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
7fd0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
7fe0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
7ff0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
8000: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
8010: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
8020: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8030: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
8040: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
8050: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
8060: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
8070: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
8080: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
8090: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
80a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
80b0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 69 66   create */..  if
80c0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
80d0: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
80e0: 6e 75 6d 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  num==1 ){.    /*
80f0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20   Special case:  
8100: 50 61 72 73 69 6e 67 20 74 68 65 20 73 71 6c 69  Parsing the sqli
8110: 74 65 5f 6d 61 73 74 65 72 20 6f 72 20 73 71 6c  te_master or sql
8120: 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
8130: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 44  schema */.    iD
8140: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
8150: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
8180: 44 62 29 29 3b 0a 20 20 20 20 70 4e 61 6d 65 20  Db));.    pName 
8190: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 65 6c 73  = pName1;.  }els
81a0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  e{.    /* The co
81b0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
81c0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
81d0: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
81e0: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
81f0: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
8200: 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72  f( iDb<0 ) retur
8210: 6e 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  n;.    if( !OMIT
8220: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
8230: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
8240: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
8250: 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69      /* If creati
8260: 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  ng a temp table,
8270: 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f   the name may no
8280: 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20  t be qualified. 
8290: 55 6e 6c 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  Unless .      **
82a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
82b0: 6d 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79  me is "temp" any
82c0: 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  way.  */.      s
82d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
82e0: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
82f0: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
8300: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
8310: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
8320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8330: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
8340: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
8350: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  ;.    zName = sq
8360: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
8370: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
8380: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
8390: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
83a0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
83b0: 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28  kenMap(pParse, (
83c0: 76 6f 69 64 2a 29 7a 4e 61 6d 65 2c 20 70 4e 61  void*)zName, pNa
83d0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
83e0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
83f0: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
8400: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
8410: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c  eturn;.  if( sql
8420: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
8430: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
8440: 65 2c 20 69 73 56 69 65 77 3f 22 76 69 65 77 22  e, isView?"view"
8450: 3a 22 74 61 62 6c 65 22 2c 20 7a 4e 61 6d 65 29  :"table", zName)
8460: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
8470: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
8480: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
8490: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
84a0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
84b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
84c0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
84d0: 72 74 28 20 69 73 54 65 6d 70 3d 3d 30 20 7c 7c  rt( isTemp==0 ||
84e0: 20 69 73 54 65 6d 70 3d 3d 31 20 29 3b 0a 20 20   isTemp==1 );.  
84f0: 61 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d  assert( isView==
8500: 30 20 7c 7c 20 69 73 56 69 65 77 3d 3d 31 20 29  0 || isView==1 )
8510: 3b 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ;.  {.    static
8520: 20 63 6f 6e 73 74 20 75 38 20 61 43 6f 64 65 5b   const u8 aCode[
8530: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 53 51 4c  ] = {.       SQL
8540: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
8550: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,.       SQLITE_
8560: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
8570: 45 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45  E,.       SQLITE
8580: 5f 43 52 45 41 54 45 5f 56 49 45 57 2c 0a 20 20  _CREATE_VIEW,.  
8590: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
85a0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 0a 20 20 20  TE_TEMP_VIEW.   
85b0: 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   };.    char *zD
85c0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
85d0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69  .zDbSName;.    i
85e0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
85f0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
8600: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
8610: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
8620: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
8630: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
8640: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
8650: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
8660: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
8670: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 28  hCheck(pParse, (
8680: 69 6e 74 29 61 43 6f 64 65 5b 69 73 54 65 6d 70  int)aCode[isTemp
8690: 2b 32 2a 69 73 56 69 65 77 5d 2c 0a 20 20 20 20  +2*isView],.    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62     zName, 0, zDb
86d0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
86e0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
86f0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
8700: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
8710: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
8720: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
8730: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
8740: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
8750: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
8760: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  e in the same da
8770: 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61  tabase.  Issue a
8780: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8790: 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e  if.  ** it does.
87a0: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
87b0: 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  s if the stateme
87c0: 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20  nt being parsed 
87d0: 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20  was passed.  ** 
87e0: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65  to an sqlite3_de
87f0: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c  clare_vtab() cal
8800: 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  l. In that case 
8810: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
8820: 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74  names.  ** and t
8830: 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  ypes will be use
8840: 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  d, so there is n
8850: 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66  o need to test f
8860: 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a  or namespace.  *
8870: 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  * collisions..  
8880: 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 53 50 45  */.  if( !IN_SPE
8890: 43 49 41 4c 5f 50 41 52 53 45 20 29 7b 0a 20 20  CIAL_PARSE ){.  
88a0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
88b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
88c0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  ame;.    if( SQL
88d0: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
88e0: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
88f0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
8900: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
8910: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  r;.    }.    pTa
8920: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  ble = sqlite3Fin
8930: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
8940: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
8950: 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  pTable ){.      
8960: 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20  if( !noErr ){.  
8970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8980: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8990: 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20  able %T already 
89a0: 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b  exists", pName);
89b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
89c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
89d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
89e0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
89f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
8a00: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
8a10: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
8a20: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
8a30: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8a50: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
8a60: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
8a70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
8a80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8a90: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
8aa0: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
8ab0: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
8ac0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
8ad0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
8ae0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
8af0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
8b00: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8b10: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
8b20: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
8b30: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
8b40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8b50: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
8b60: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
8b70: 42 4b 50 54 3b 0a 20 20 20 20 70 50 61 72 73 65  BKPT;.    pParse
8b80: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
8b90: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
8ba0: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
8bb0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
8bc0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
8bd0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
8be0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
8bf0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
8c00: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 54 61  a;.  pTable->nTa
8c10: 62 52 65 66 20 3d 20 31 3b 0a 23 69 66 64 65 66  bRef = 1;.#ifdef
8c20: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
8c30: 52 4f 57 45 53 54 0a 20 20 70 54 61 62 6c 65 2d  ROWEST.  pTable-
8c40: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 73 71  >nRowLogEst = sq
8c50: 6c 69 74 65 33 4c 6f 67 45 73 74 28 53 51 4c 49  lite3LogEst(SQLI
8c60: 54 45 5f 44 45 46 41 55 4c 54 5f 52 4f 57 45 53  TE_DEFAULT_ROWES
8c70: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 70 54 61 62  T);.#else.  pTab
8c80: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
8c90: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
8ca0: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
8cb0: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 23 65 6e  (1048576) );.#en
8cc0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 50  dif.  assert( pP
8cd0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
8ce0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
8cf0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
8d00: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
8d10: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
8d20: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
8d30: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
8d40: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
8d50: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
8d60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
8d70: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
8d80: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
8d90: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
8da0: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
8db0: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
8dc0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
8dd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8de0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
8df0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
8e00: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
8e10: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
8e20: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
8e30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
8e40: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
8e50: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
8e60: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
8e70: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
8e80: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
8e90: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
8ea0: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
8eb0: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
8ec0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
8ed0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
8ee0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
8ef0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
8f00: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
8f10: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
8f20: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
8f30: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
8f40: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
8f50: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
8f60: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
8f70: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
8f80: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
8f90: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
8fa0: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
8fb0: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
8fc0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
8fd0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
8fe0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
8ff0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
9000: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
9010: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
9020: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
9030: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
9040: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
9050: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
9060: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
9070: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
9080: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
9090: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
90a0: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
90b0: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
90c0: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
90d0: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
90e0: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
90f0: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
9100: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
9110: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
9120: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
9130: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
9140: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
9150: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
9160: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
9170: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
9180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9190: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
91a0: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
91b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
91c0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
91d0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
91e0: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
91f0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
9200: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
9210: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
9220: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
9230: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
9240: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
9250: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
9260: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
9270: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
9280: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
9290: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
92a0: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
92b0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
92c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
92d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
92e0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
92f0: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
9300: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
9310: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
9320: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
9330: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
9340: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
9350: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
9360: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
9370: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
9380: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
9390: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
93a0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
93b0: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
93c0: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
93d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
93e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
93f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
9400: 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 66  E_FILE_FORMAT, f
9410: 69 6c 65 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  ileFormat);.    
9420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9430: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
9440: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
9450: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 45 4e 43  XT_ENCODING, ENC
9460: 28 64 62 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  (db));.    sqlit
9470: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9480: 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20 2f  , addr1);..    /
9490: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
94a0: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
94b0: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
94c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
94d0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
94e0: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
94f0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
9500: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
9510: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
9520: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
9530: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
9540: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
9550: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
9560: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
9570: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
9580: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
9590: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
95a0: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
95b0: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
95c0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
95d0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
95e0: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
95f0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
9600: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
9610: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
9620: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
9630: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
9640: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
9650: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
9660: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
9670: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
9680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9690: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
96a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
96b0: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
96c0: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
96d0: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
96e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
96f0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
9700: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
9710: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
9720: 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65    {.      pParse
9730: 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 0a 20 20  ->addrCrTab =.  
9740: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9750: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
9760: 72 65 61 74 65 42 74 72 65 65 2c 20 69 44 62 2c  reateBtree, iDb,
9770: 20 72 65 67 32 2c 20 42 54 52 45 45 5f 49 4e 54   reg2, BTREE_INT
9780: 4b 45 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  KEY);.    }.    
9790: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
97a0: 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  rTable(pParse, i
97b0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
97c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
97d0: 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65  _NewRowid, 0, re
97e0: 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g1);.    sqlite3
97f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9800: 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20  _Blob, 6, reg3, 
9810: 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53  0, nullRow, P4_S
9820: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69  TATIC);.    sqli
9830: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9840: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
9850: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
9860: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9870: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
9880: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
9890: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
98a0: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
98b0: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
98c0: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
98d0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
98e0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
98f0: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
9900: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
9910: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
9920: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
9930: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
9940: 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f 70 65 72  }../* Set proper
9950: 74 69 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ties of a table 
9960: 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20  column based on 
9970: 74 68 65 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a  the (magical).**
9980: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   name of the col
9990: 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  umn..*/.#if SQLI
99a0: 54 45 5f 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e  TE_ENABLE_HIDDEN
99b0: 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71  _COLUMNS.void sq
99c0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
99d0: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61  rtiesFromName(Ta
99e0: 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d  ble *pTab, Colum
99f0: 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20  n *pCol){.  if( 
9a00: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
9a10: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f  (pCol->zName, "_
9a20: 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d  _hidden__", 10)=
9a30: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e  =0 ){.    pCol->
9a40: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
9a50: 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65  LAG_HIDDEN;.  }e
9a60: 6c 73 65 20 69 66 28 20 70 54 61 62 20 26 26 20  lse if( pTab && 
9a70: 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c  pCol!=pTab->aCol
9a80: 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f   && (pCol[-1].co
9a90: 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
9aa0: 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20 20 20 20  _HIDDEN) ){.    
9ab0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
9ac0: 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a  = TF_OOOHidden;.
9ad0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
9ae0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
9af0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
9b00: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
9b10: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
9b20: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
9b30: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
9b40: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
9b50: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
9b60: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
9b70: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9b80: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
9b90: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
9ba0: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
9bb0: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
9bc0: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
9bd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9be0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
9bf0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
9c00: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
9c10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9c20: 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 6f 6b 65 6e  en *pName, Token
9c30: 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c   *pType){.  Tabl
9c40: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
9c50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
9c60: 20 2a 7a 54 79 70 65 3b 0a 20 20 43 6f 6c 75 6d   *zType;.  Colum
9c70: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
9c80: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9c90: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
9ca0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9cb0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
9cc0: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
9cd0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
9ce0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
9cf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
9d00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9d10: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
9d20: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
9d30: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
9d40: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
9d50: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
9d60: 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 70 54 79 70   pName->n + pTyp
9d70: 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 20 69 66 28  e->n + 2);.  if(
9d80: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
9d90: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
9da0: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
9db0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70  RenameTokenMap(p
9dc0: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c  Parse, (void*)z,
9dd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70   pName);.  memcp
9de0: 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70  y(z, pName->z, p
9df0: 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 4e  Name->n);.  z[pN
9e00: 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73  ame->n] = 0;.  s
9e10: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29  qlite3Dequote(z)
9e20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9e30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
9e40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
9e50: 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f 6c  ricmp(z, p->aCol
9e60: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
9e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9e80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9e90: 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e  duplicate column
9ea0: 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a   name: %s", z);.
9eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9ec0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
9ed0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
9ee0: 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43    }.  if( (p->nC
9ef0: 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a  ol & 0x7)==0 ){.
9f00: 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77      Column *aNew
9f10: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
9f20: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
9f30: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
9f40: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
9f50: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
9f60: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
9f70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9f80: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72  (db, z);.      r
9f90: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
9fa0: 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b   p->aCol = aNew;
9fb0: 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70  .  }.  pCol = &p
9fc0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b  ->aCol[p->nCol];
9fd0: 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20  .  memset(pCol, 
9fe0: 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  0, sizeof(p->aCo
9ff0: 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e  l[0]));.  pCol->
a000: 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71 6c  zName = z;.  sql
a010: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
a020: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c 20  tiesFromName(p, 
a030: 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 66 28 20 70  pCol);. .  if( p
a040: 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Type->n==0 ){.  
a050: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
a060: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
a070: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
a080: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
a090: 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20 27 42 4c  inity.    ** 'BL
a0a0: 4f 42 27 20 77 69 74 68 20 61 20 64 65 66 61 75  OB' with a defau
a0b0: 6c 74 20 73 69 7a 65 20 6f 66 20 34 20 62 79 74  lt size of 4 byt
a0c0: 65 73 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d  es. */.    pCol-
a0d0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
a0e0: 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
a0f0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31   pCol->szEst = 1
a100: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
a110: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
a120: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
a130: 20 34 3e 3d 73 71 6c 69 74 65 33 47 6c 6f 62 61   4>=sqlite3Globa
a140: 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74 65 72  lConfig.szSorter
a150: 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  Ref ){.      pCo
a160: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
a170: 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46  OLFLAG_SORTERREF
a180: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
a190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 79 70   }else{.    zTyp
a1a0: 65 20 3d 20 7a 20 2b 20 73 71 6c 69 74 65 33 53  e = z + sqlite3S
a1b0: 74 72 6c 65 6e 33 30 28 7a 29 20 2b 20 31 3b 0a  trlen30(z) + 1;.
a1c0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65      memcpy(zType
a1d0: 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 70 54 79 70  , pType->z, pTyp
a1e0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a 54 79 70 65  e->n);.    zType
a1f0: 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d 20 30 3b 0a  [pType->n] = 0;.
a200: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
a210: 74 65 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 70  te(zType);.    p
a220: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
a230: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
a240: 79 70 65 28 7a 54 79 70 65 2c 20 70 43 6f 6c 29  ype(zType, pCol)
a250: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46  ;.    pCol->colF
a260: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a270: 48 41 53 54 59 50 45 3b 0a 20 20 7d 0a 20 20 70  HASTYPE;.  }.  p
a280: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 70 2d 3e 6e  ->nCol++;.  p->n
a290: 4e 56 43 6f 6c 2b 2b 3b 0a 20 20 70 50 61 72 73  NVCol++;.  pPars
a2a0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
a2b0: 65 2e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  e.n = 0;.}../*.*
a2c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
a2d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
a2e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
a2f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
a300: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
a310: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
a320: 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22  t.  A "NOT NULL"
a330: 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a   constraint has.
a340: 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20  ** been seen on 
a350: 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20  a column.  This 
a360: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
a370: 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e   notNull flag on
a380: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  .** the column c
a390: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
a3a0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
a3b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e  void sqlite3AddN
a3c0: 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  otNull(Parse *pP
a3d0: 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f  arse, int onErro
a3e0: 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  r){.  Table *p;.
a3f0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
a400: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
a410: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
a420: 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
a430: 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e  nCol<1) ) return
a440: 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61  ;.  pCol = &p->a
a450: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a  Col[p->nCol-1];.
a460: 20 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 20    pCol->notNull 
a470: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
a480: 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20   p->tabFlags |= 
a490: 54 46 5f 48 61 73 4e 6f 74 4e 75 6c 6c 3b 0a 0a  TF_HasNotNull;..
a4a0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 6e 69    /* Set the uni
a4b0: 71 4e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e  qNotNull flag on
a4c0: 20 61 6e 79 20 55 4e 49 51 55 45 20 6f 72 20 50   any UNIQUE or P
a4d0: 4b 20 69 6e 64 65 78 65 73 20 61 6c 72 65 61 64  K indexes alread
a4e0: 79 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 6f  y created.  ** o
a4f0: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 2e 20 20  n this column.  
a500: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 63  */.  if( pCol->c
a510: 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
a520: 47 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20  G_UNIQUE ){.    
a530: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
a540: 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e   for(pIdx=p->pIn
a550: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
a560: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
a570: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
a580: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
a590: 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
a5a0: 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20  E_None );.      
a5b0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
a5c0: 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e 43 6f 6c 2d 31  mn[0]==p->nCol-1
a5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78   ){.        pIdx
a5e0: 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
a5f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
a600: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  .  }.}../*.** Sc
a610: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
a620: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
a630: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
a640: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
a650: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
a660: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
a670: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
a680: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
a690: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
a6a0: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
a6b0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
a6c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
a6d0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
a6e0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
a6f0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
a700: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
a710: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
a720: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
a730: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
a740: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
a750: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
a760: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
a770: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
a780: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
a790: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
a7a0: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
a7b0: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
a7c0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
a7d0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
a7e0: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
a7f0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
a800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a810: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
a820: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
a830: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
a840: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
a850: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
a860: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
a870: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
a880: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
a890: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
a8a0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
a8b0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
a8c0: 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27 52  E_AFF_BLOB.** 'R
a8d0: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
a8e0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
a8f0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
a900: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
a910: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
a920: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
a930: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
a940: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
a950: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
a960: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
a970: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
a980: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
a990: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
a9a0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
a9b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
a9c0: 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b  , Column *pCol){
a9d0: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
a9e0: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
a9f0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
aa00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
aa10: 61 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ar = 0;..  asser
aa20: 74 28 20 7a 49 6e 21 3d 30 20 29 3b 0a 20 20 77  t( zIn!=0 );.  w
aa30: 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  hile( zIn[0] ){.
aa40: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
aa50: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
aa60: 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66  ower[(*zIn)&0xff
aa70: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
aa80: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
aa90: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
aaa0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
aab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
aac0: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
aad0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
aae0: 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d  T;.      zChar =
aaf0: 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   zIn;.    }else 
ab00: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
ab10: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
ab20: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
ab30: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
ab40: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
ab50: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
ab60: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
ab70: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
ab80: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
ab90: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
aba0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
abb0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
abc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
abd0: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
abe0: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
abf0: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
ac00: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
ac10: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
ac20: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
ac30: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
ac40: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
ac50: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  f = SQLITE_AFF_B
ac60: 4c 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  LOB;.      if( z
ac70: 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68  In[0]=='(' ) zCh
ac80: 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65  ar = zIn;.#ifnde
ac90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
aca0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
acb0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
acc0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
acd0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
ace0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
acf0: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
ad00: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
ad10: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
ad20: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
ad30: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
ad40: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
ad50: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
ad60: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
ad70: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
ad80: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
ad90: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ada0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
adb0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
adc0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
add0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
ade0: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
adf0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
ae00: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
ae10: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
ae20: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
ae30: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
ae40: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
ae50: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
ae60: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
ae70: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
ae80: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
ae90: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
aea0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
aeb0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
aec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aed0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 43 6f 6c   }..  /* If pCol
aee0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74   is not NULL, st
aef0: 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20  ore an estimate 
af00: 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a  of the field siz
af10: 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74  e.  The.  ** est
af20: 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64 20  imate is scaled 
af30: 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  so that the size
af40: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69   of an integer i
af50: 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  s 1.  */.  if( p
af60: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  Col ){.    int v
af70: 20 3d 20 30 3b 20 20 20 2f 2a 20 64 65 66 61 75   = 0;   /* defau
af80: 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f  lt size is appro
af90: 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20  x 4 bytes */.   
afa0: 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f   if( aff<SQLITE_
afb0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
afc0: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
afd0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
afe0: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
aff0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
b000: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
b010: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
b020: 20 20 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56     /* BLOB(k), V
b030: 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28  ARCHAR(k), CHAR(
b040: 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20  k) -> r=(k/4+1) 
b050: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
b060: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
b070: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
b080: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b0a0: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
b0b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b0c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20  se{.        v = 
b0d0: 31 36 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54  16;   /* BLOB, T
b0e0: 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35  EXT, CLOB -> r=5
b0f0: 20 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74    (approx 20 byt
b100: 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  es)*/.      }.  
b110: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
b120: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
b130: 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69  REFERENCES.    i
b140: 66 28 20 76 3e 3d 73 71 6c 69 74 65 33 47 6c 6f  f( v>=sqlite3Glo
b150: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f 72 74  balConfig.szSort
b160: 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20 70  erRef ){.      p
b170: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
b180: 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52   COLFLAG_SORTERR
b190: 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  EF;.    }.#endif
b1a0: 0a 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31  .    v = v/4 + 1
b1b0: 3b 0a 20 20 20 20 69 66 28 20 76 3e 32 35 35 20  ;.    if( v>255 
b1c0: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 70  ) v = 255;.    p
b1d0: 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 76 3b 0a  Col->szEst = v;.
b1e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
b1f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65  ;.}../*.** The e
b200: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
b210: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
b220: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
b230: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
b240: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  n.** of the tabl
b250: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
b260: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
b270: 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61  **.** Default va
b280: 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lue expressions 
b290: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
b2a0: 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65  .  Raise an exce
b2b0: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ption if this.**
b2c0: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
b2d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b2e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
b2f0: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
b300: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
b310: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
b320: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
b330: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
b340: 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75   sqlite3AddDefau
b350: 6c 74 56 61 6c 75 65 28 0a 20 20 50 61 72 73 65  ltValue(.  Parse
b360: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b370: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b380: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
b390: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
b3a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b3b0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  ed expression of
b3c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
b3d0: 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ue */.  const ch
b3e0: 61 72 20 2a 7a 53 74 61 72 74 2c 20 20 20 20 20  ar *zStart,     
b3f0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 74 68 65   /* Start of the
b400: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 74   default value t
b410: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
b420: 68 61 72 20 2a 7a 45 6e 64 20 20 20 20 20 20 20  har *zEnd       
b430: 20 20 2f 2a 20 46 69 72 73 74 20 63 68 61 72 61    /* First chara
b440: 63 74 65 72 20 70 61 73 74 20 65 6e 64 20 6f 66  cter past end of
b450: 20 64 65 66 61 75 74 20 76 61 6c 75 65 20 74 65   defaut value te
b460: 78 74 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  xt */.){.  Table
b470: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
b480: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
b490: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b4a0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
b4b0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
b4c0: 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  p!=0 ){.    pCol
b4d0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
b4e0: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
b4f0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
b500: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
b510: 6f 6e 28 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e  on(pExpr, db->in
b520: 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20  it.busy) ){.    
b530: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b540: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
b550: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
b560: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
b570: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
b580: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
b590: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b5a0: 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44 5f  _OMIT_GENERATED_
b5b0: 43 4f 4c 55 4d 4e 53 0a 20 20 20 20 7d 65 6c 73  COLUMNS.    }els
b5c0: 65 20 69 66 28 20 70 43 6f 6c 2d 3e 63 6f 6c 46  e if( pCol->colF
b5d0: 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 47  lags & COLFLAG_G
b5e0: 45 4e 45 52 41 54 45 44 20 29 7b 0a 20 20 20 20  ENERATED ){.    
b5f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
b600: 2d 3e 63 6f 6c 66 6c 61 67 73 20 26 20 43 4f 4c  ->colflags & COL
b610: 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 3b 0a  FLAG_VIRTUAL );.
b620: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b630: 70 43 6f 6c 2d 3e 63 6f 6c 66 6c 61 67 73 20 26  pCol->colflags &
b640: 20 43 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44 20   COLFLAG_STORED 
b650: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b660: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
b670: 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 44 45 46   "cannot use DEF
b680: 41 55 4c 54 20 6f 6e 20 61 20 67 65 6e 65 72 61  AULT on a genera
b690: 74 65 64 20 63 6f 6c 75 6d 6e 22 29 3b 0a 23 65  ted column");.#e
b6a0: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
b6b0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
b6c0: 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64  of pExpr is used
b6d0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
b6e0: 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78  original, as pEx
b6f0: 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  pr contains.    
b700: 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74    ** tokens that
b710: 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69   point to volati
b720: 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20 20 20  le memory..     
b730: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 78   */.      Expr x
b740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b750: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
b760: 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20  ol->pDflt);.    
b770: 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20    memset(&x, 0, 
b780: 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
b790: 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 41 4e    x.op = TK_SPAN
b7a0: 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 6f 6b  ;.      x.u.zTok
b7b0: 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 70  en = sqlite3DbSp
b7c0: 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 72 74  anDup(db, zStart
b7d0: 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20 20 78  , zEnd);.      x
b7e0: 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a  .pLeft = pExpr;.
b7f0: 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 3d 20        x.flags = 
b800: 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70  EP_Skip;.      p
b810: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
b820: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b830: 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  &x, EXPRDUP_REDU
b840: 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CE);.      sqlit
b850: 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 2e 75  e3DbFree(db, x.u
b860: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  .zToken);.    }.
b870: 20 20 7d 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e    }.  if( IN_REN
b880: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
b890: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45    sqlite3RenameE
b8a0: 78 70 72 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  xprUnmap(pParse,
b8b0: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 73   pExpr);.  }.  s
b8c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
b8d0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (db, pExpr);.}..
b8e0: 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72 64 73 20  /*.** Backwards 
b8f0: 43 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 48 61  Compatibility Ha
b900: 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f  ck:.** .** Histo
b910: 72 69 63 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f  rical versions o
b920: 66 20 53 51 4c 69 74 65 20 61 63 63 65 70 74 65  f SQLite accepte
b930: 64 20 73 74 72 69 6e 67 73 20 61 73 20 63 6f 6c  d strings as col
b940: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20  umn names in.** 
b950: 69 6e 64 65 78 65 73 20 61 6e 64 20 50 52 49 4d  indexes and PRIM
b960: 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
b970: 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e 49 51 55  nts and in UNIQU
b980: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20  E constraints.  
b990: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
b9a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
b9b0: 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52  xyz(a,b,c,d,e,PR
b9c0: 49 4d 41 52 59 20 4b 45 59 28 27 61 27 29 2c 55  IMARY KEY('a'),U
b9d0: 4e 49 51 55 45 28 27 62 27 2c 27 63 27 20 43 4f  NIQUE('b','c' CO
b9e0: 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20  LLATE trim).**  
b9f0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
ba00: 61 62 63 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27  abc ON xyz('c','
ba10: 64 27 20 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c  d' DESC,'e' COLL
ba20: 41 54 45 20 6e 6f 63 61 73 65 20 44 45 53 43 29  ATE nocase DESC)
ba30: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ;.**.** This is 
ba40: 67 6f 6f 66 79 2e 20 20 42 75 74 20 74 6f 20 70  goofy.  But to p
ba50: 72 65 73 65 72 76 65 20 62 61 63 6b 77 61 72 64  reserve backward
ba60: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
ba70: 77 65 20 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a  we continue to.*
ba80: 2a 20 61 63 63 65 70 74 20 69 74 2e 20 20 54 68  * accept it.  Th
ba90: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
baa0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 63 6f  the necessary co
bab0: 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f  nversion.  It co
bac0: 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 65 78  nverts.** the ex
bad0: 70 72 65 73 73 69 6f 6e 20 67 69 76 65 6e 20 69  pression given i
bae0: 6e 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 66  n its argument f
baf0: 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  rom a TK_STRING 
bb00: 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20  into a TK_ID.** 
bb10: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
bb20: 6e 20 69 73 20 6a 75 73 74 20 61 20 54 4b 5f 53  n is just a TK_S
bb30: 54 52 49 4e 47 20 77 69 74 68 20 61 6e 20 6f 70  TRING with an op
bb40: 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63  tional COLLATE c
bb50: 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65  lause..** If the
bb60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bb70: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
bb80: 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68  an TK_STRING, th
bb90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a  e expression is.
bba0: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ** unchanged..*/
bbb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
bbc0: 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 45  ite3StringToId(E
bbd0: 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  xpr *p){.  if( p
bbe0: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
bbf0: 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  ){.    p->op = T
bc00: 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  K_ID;.  }else if
bc10: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  ( p->op==TK_COLL
bc20: 41 54 45 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d  ATE && p->pLeft-
bc30: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op==TK_STRING )
bc40: 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e  {.    p->pLeft->
bc50: 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a  op = TK_ID;.  }.
bc60: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
bc70: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
bc80: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
bc90: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
bca0: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
bcb0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
bcc0: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
bcd0: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
bce0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
bcf0: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
bd00: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
bd10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
bd20: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
bd30: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
bd40: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
bd50: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
bd60: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
bd70: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
bd80: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
bd90: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
bda0: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
bdb0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
bdc0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
bdd0: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
bde0: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
bdf0: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
be00: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
be10: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
be20: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
be30: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
be40: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
be50: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
be60: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
be70: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
be80: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
be90: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
bea0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
beb0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
bec0: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
bed0: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
bee0: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
bef0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
bf00: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
bf10: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
bf20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
bf30: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
bf40: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
bf50: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
bf60: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
bf70: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
bf80: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
bf90: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
bfa0: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
bfb0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
bfc0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bfd0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
bfe0: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
bff0: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
c000: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
c010: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
c020: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
c030: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
c040: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
c050: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
c060: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
c070: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
c080: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
c090: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
c0a0: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
c0b0: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
c0c0: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
c0d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c0e0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c0f0: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
c100: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
c110: 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74  l = -1, i;.  int
c120: 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54   nTerm;.  if( pT
c130: 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 70 72 69  ab==0 ) goto pri
c140: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
c150: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
c160: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
c170: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
c180: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c190: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
c1a0: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
c1b0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
c1c0: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
c1d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
c1e0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
c1f0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
c200: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
c210: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
c220: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
c230: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
c240: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
c250: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
c260: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 70 43 6f  l[iCol];.    pCo
c270: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
c280: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
c290: 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20      nTerm = 1;. 
c2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72   }else{.    nTer
c2b0: 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  m = pList->nExpr
c2c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c2d0: 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nTerm; i++){.  
c2e0: 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
c2f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
c300: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
c310: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
c320: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45 78      assert( pCEx
c330: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  pr!=0 );.      s
c340: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
c350: 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20  (pCExpr);.      
c360: 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d  if( pCExpr->op==
c370: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
c380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e   const char *zCN
c390: 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e  ame = pCExpr->u.
c3a0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
c3b0: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
c3c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
c3d0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
c3e0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
c3f0: 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d  mp(zCName, pTab-
c400: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
c410: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
c420: 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
c430: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
c440: 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
c450: 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  >colFlags |= COL
c460: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
c470: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c480: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c4a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
c4b0: 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 70 43  Term==1.   && pC
c4c0: 6f 6c 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ol.   && sqlite3
c4d0: 53 74 72 49 43 6d 70 28 73 71 6c 69 74 65 33 43  StrICmp(sqlite3C
c4e0: 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 22  olumnType(pCol,"
c4f0: 22 29 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  "), "INTEGER")==
c500: 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65  0.   && sortOrde
c510: 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  r!=SQLITE_SO_DES
c520: 43 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 49  C.  ){.    if( I
c530: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
c540: 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
c550: 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d    Expr *pCExpr =
c560: 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
c570: 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61  Collate(pList->a
c580: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
c590: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
c5a0: 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
c5b0: 2c 20 26 70 54 61 62 2d 3e 69 50 4b 65 79 2c 20  , &pTab->iPKey, 
c5c0: 70 43 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20  pCExpr);.    }. 
c5d0: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
c5e0: 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d   iCol;.    pTab-
c5f0: 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f  >keyConf = (u8)o
c600: 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65  nError;.    asse
c610: 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c  rt( autoInc==0 |
c620: 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a  | autoInc==1 );.
c630: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
c640: 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46  gs |= autoInc*TF
c650: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a  _Autoincrement;.
c660: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
c670: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
c680: 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  rder = pList->a[
c690: 30 5d 2e 73 6f 72 74 46 6c 61 67 73 3b 0a 20 20  0].sortFlags;.  
c6a0: 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e  }else if( autoIn
c6b0: 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  c ){.#ifndef SQL
c6c0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
c6d0: 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74  REMENT.    sqlit
c6e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c6f0: 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e  e, "AUTOINCREMEN
c700: 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65  T is only allowe
c710: 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20  d on an ".      
c720: 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   "INTEGER PRIMAR
c730: 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a  Y KEY");.#endif.
c740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
c750: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
c760: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c  pParse, 0, 0, 0,
c770: 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c   pList, onError,
c780: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c7a0: 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20  , sortOrder, 0, 
c7b0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
c7c0: 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20 20 20  RIMARYKEY);.    
c7d0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
c7e0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
c7f0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
c800: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
c810: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
c820: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
c830: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
c840: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
c850: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
c860: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
c870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
c880: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
c890: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
c8a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
c8b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c8c0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
c8d0: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
c8e0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
c8f0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
c900: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
c910: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
c920: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c930: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
c940: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
c950: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
c960: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
c970: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
c980: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
c990: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
c9a0: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
c9b0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
c9c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
c9d0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
c9e0: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
c9f0: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
ca00: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
ca10: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
ca20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
ca30: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
ca40: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
ca50: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
ca60: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
ca70: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
ca80: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
ca90: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
caa0: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
cab0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
cac0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
cad0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
cae0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
caf0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
cb00: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
cb10: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
cb20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
cb30: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
cb40: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
cb50: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
cb60: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
cb70: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
cb90: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
cba0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
cbb0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
cbc0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
cbd0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
cbe0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
cbf0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
cc00: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
cc10: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
cc20: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
cc30: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
cc40: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
cc50: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
cc60: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
cc70: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
cc80: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
cc90: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
cca0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
ccb0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
ccc0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
ccd0: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
cce0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
ccf0: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
cd00: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
cd10: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
cd20: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
cd30: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
cd40: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
cd50: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
cd60: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
cd70: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
cd80: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
cd90: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
cda0: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
cdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
cdc0: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
cdd0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
cde0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
cdf0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
ce00: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
ce10: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
ce20: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
ce30: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ce40: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
ce50: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
ce60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ce70: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ce80: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
ce90: 0a 7d 0a 0a 2f 2a 20 43 68 61 6e 67 65 20 74 68  .}../* Change th
cea0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
ceb0: 70 61 72 73 65 64 20 63 6f 6c 75 6d 6e 20 74 6f  parsed column to
cec0: 20 62 65 20 61 20 47 45 4e 45 52 41 54 45 44 20   be a GENERATED 
ced0: 41 4c 57 41 59 53 20 41 53 0a 2a 2a 20 63 6f 6c  ALWAYS AS.** col
cee0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
cef0: 69 74 65 33 41 64 64 47 65 6e 65 72 61 74 65 64  ite3AddGenerated
cf00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
cf10: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
cf20: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 23 69 66 6e  en *pType){.#ifn
cf30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cf40: 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e  GENERATED_COLUMN
cf50: 53 0a 20 20 75 38 20 65 54 79 70 65 20 3d 20 43  S.  u8 eType = C
cf60: 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c 3b 0a  OLFLAG_VIRTUAL;.
cf70: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
cf80: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
cf90: 65 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  e;.  Column *pCo
cfa0: 6c 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  l;.  if( pTab==0
cfb0: 20 29 20 67 6f 74 6f 20 67 65 6e 65 72 61 74 65   ) goto generate
cfc0: 64 5f 64 6f 6e 65 3b 0a 20 20 70 43 6f 6c 20 3d  d_done;.  pCol =
cfd0: 20 26 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54   &(pTab->aCol[pT
cfe0: 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20  ab->nCol-1]);.  
cff0: 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56  if( IN_DECLARE_V
d000: 54 41 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  TAB ){.    sqlit
d010: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
d020: 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c  e, "virtual tabl
d030: 65 73 20 63 61 6e 6e 6f 74 20 75 73 65 20 63 6f  es cannot use co
d040: 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 73 22 29  mputed columns")
d050: 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 6e 65 72  ;.    goto gener
d060: 61 74 65 64 5f 64 6f 6e 65 3b 0a 20 20 7d 0a 20  ated_done;.  }. 
d070: 20 69 66 28 20 70 43 6f 6c 2d 3e 70 44 66 6c 74   if( pCol->pDflt
d080: 20 29 20 67 6f 74 6f 20 67 65 6e 65 72 61 74 65   ) goto generate
d090: 64 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 70  d_error;.  if( p
d0a0: 54 79 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Type ){.    if( 
d0b0: 70 54 79 70 65 2d 3e 6e 3d 3d 37 20 26 26 20 73  pType->n==7 && s
d0c0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 22  qlite3StrNICmp("
d0d0: 76 69 72 74 75 61 6c 22 2c 70 54 79 70 65 2d 3e  virtual",pType->
d0e0: 7a 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  z,7)==0 ){.     
d0f0: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
d100: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 79 70 65   }else if( pType
d110: 2d 3e 6e 3d 3d 36 20 26 26 20 73 71 6c 69 74 65  ->n==6 && sqlite
d120: 33 53 74 72 4e 49 43 6d 70 28 22 73 74 6f 72 65  3StrNICmp("store
d130: 64 22 2c 70 54 79 70 65 2d 3e 7a 2c 36 29 3d 3d  d",pType->z,6)==
d140: 30 20 29 7b 0a 20 20 20 20 20 20 65 54 79 70 65  0 ){.      eType
d150: 20 3d 20 43 4f 4c 46 4c 41 47 5f 53 54 4f 52 45   = COLFLAG_STORE
d160: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
d170: 20 20 20 20 67 6f 74 6f 20 67 65 6e 65 72 61 74      goto generat
d180: 65 64 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ed_error;.    }.
d190: 20 20 7d 0a 20 20 69 66 28 20 65 54 79 70 65 3d    }.  if( eType=
d1a0: 3d 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c  =COLFLAG_VIRTUAL
d1b0: 20 29 20 70 54 61 62 2d 3e 6e 4e 56 43 6f 6c 2d   ) pTab->nNVCol-
d1c0: 2d 3b 0a 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c  -;.  pCol->colFl
d1d0: 61 67 73 20 7c 3d 20 65 54 79 70 65 3b 0a 20 20  ags |= eType;.  
d1e0: 61 73 73 65 72 74 28 20 54 46 5f 48 61 73 56 69  assert( TF_HasVi
d1f0: 72 74 75 61 6c 3d 3d 43 4f 4c 46 4c 41 47 5f 56  rtual==COLFLAG_V
d200: 49 52 54 55 41 4c 20 29 3b 0a 20 20 61 73 73 65  IRTUAL );.  asse
d210: 72 74 28 20 54 46 5f 48 61 73 53 74 6f 72 65 64  rt( TF_HasStored
d220: 3d 3d 43 4f 4c 46 4c 41 47 5f 53 54 4f 52 45 44  ==COLFLAG_STORED
d230: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 74 61 62 46   );.  pTab->tabF
d240: 6c 61 67 73 20 7c 3d 20 65 54 79 70 65 3b 0a 20  lags |= eType;. 
d250: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70   pCol->pDflt = p
d260: 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
d270: 30 3b 0a 20 20 67 6f 74 6f 20 67 65 6e 65 72 61  0;.  goto genera
d280: 74 65 64 5f 64 6f 6e 65 3b 0a 0a 67 65 6e 65 72  ted_done;..gener
d290: 61 74 65 64 5f 65 72 72 6f 72 3a 0a 20 20 73 71  ated_error:.  sq
d2a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d2b0: 61 72 73 65 2c 20 22 65 72 72 6f 72 20 69 6e 20  arse, "error in 
d2c0: 67 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d 6e  generated column
d2d0: 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
d2f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 67 65 6e 65 72 61  ->zName);.genera
d300: 74 65 64 5f 64 6f 6e 65 3a 0a 20 20 73 71 6c 69  ted_done:.  sqli
d310: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
d320: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29  arse->db, pExpr)
d330: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 54 68 72  ;.#else.  /* Thr
d340: 6f 77 20 61 6e 64 20 65 72 72 6f 72 20 66 6f 72  ow and error for
d350: 20 74 68 65 20 47 45 4e 45 52 41 54 45 44 20 41   the GENERATED A
d360: 4c 57 41 59 53 20 41 53 20 63 6c 61 75 73 65 20  LWAYS AS clause 
d370: 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  if the.  ** SQLI
d380: 54 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45  TE_OMIT_GENERATE
d390: 44 5f 43 4f 4c 55 4d 4e 53 20 63 6f 6d 70 69 6c  D_COLUMNS compil
d3a0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
d3b0: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69   used. */.  sqli
d3c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
d3d0: 73 65 2c 20 22 67 65 6e 65 72 61 74 65 64 20 63  se, "generated c
d3e0: 6f 6c 75 6d 6e 73 20 6e 6f 74 20 73 75 70 70 6f  olumns not suppo
d3f0: 72 74 65 64 22 29 3b 0a 20 20 73 71 6c 69 74 65  rted");.  sqlite
d400: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
d410: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
d420: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d430: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d440: 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e  at will incremen
d450: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
d460: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  kie..**.** The s
d470: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20  chema cookie is 
d480: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
d490: 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  e when the schem
d4a0: 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74  a for the.** dat
d4b0: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
d4c0: 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65 6d  After each schem
d4d0: 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f  a change, the co
d4e0: 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68  okie value.** ch
d4f0: 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70  anges.  When a p
d500: 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65 61  rocess first rea
d510: 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69 74  ds the schema it
d520: 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20   records the.** 
d530: 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66  cookie.  Thereaf
d540: 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74  ter, whenever it
d550: 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20   goes to access 
d560: 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a  the database,.**
d570: 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20 63   it checks the c
d580: 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75  ookie to make su
d590: 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  re the schema ha
d5a0: 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a  s not changed.**
d5b0: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61   since it was la
d5c0: 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  st read..**.** T
d5d0: 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20  his plan is not 
d5e0: 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65  completely bulle
d5f0: 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20  t-proof.  It is 
d600: 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20  possible for.** 
d610: 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68  the schema to ch
d620: 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69  ange multiple ti
d630: 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20  mes and for the 
d640: 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20  cookie to be.** 
d650: 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f  set back to prio
d660: 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63  r value.  But sc
d670: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65  hema changes are
d680: 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61   infrequent.** a
d690: 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  nd the probabili
d6a0: 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68  ty of hitting th
d6b0: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
d6c0: 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31  lue is only.** 1
d6d0: 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e   chance in 2^32.
d6e0: 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65 20    So we're safe 
d6f0: 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 49 4d  enough..**.** IM
d700: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
d710: 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39 20 53   R-34230-56049 S
d720: 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61  QLite automatica
d730: 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 0a 2a  lly increments.*
d740: 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 65 72  * the schema-ver
d750: 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 74 68  sion whenever th
d760: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
d770: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d780: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61  3ChangeCookie(Pa
d790: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
d7a0: 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
d7b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d7c0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d7d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d7e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
d7f0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
d800: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
d810: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d820: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
d830: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43  e, iDb, BTREE_SC
d840: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 0a 20  HEMA_VERSION, . 
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73 69 67    (int)(1+(unsig
d870: 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ned)db->aDb[iDb]
d880: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
d890: 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a 2f 2a  _cookie));.}../*
d8a0: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
d8b0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
d8c0: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
d8d0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
d8e0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
d8f0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
d900: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
d910: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
d920: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
d930: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
d940: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
d950: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
d960: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
d970: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
d980: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
d990: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
d9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
d9b0: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
d9c0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
d9d0: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
d9e0: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
d9f0: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
da00: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
da10: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
da20: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
da30: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
da40: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70  inter to an outp
da50: 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73  ut buffer. The s
da60: 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  econd .** parame
da70: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
da80: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74   to an integer t
da90: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
daa0: 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68   offset at.** wh
dab0: 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ich to write int
dac0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
dad0: 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
dae0: 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a  on copies the.**
daf0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
db00: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
db10: 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70  o by the third p
db20: 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65  arameter, zSigne
db30: 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68  dIdent,.** to th
db40: 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73  e specified offs
db50: 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  et in the buffer
db60: 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49   and updates *pI
db70: 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74  dx to refer.** t
db80: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
db90: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
dba0: 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66  byte written bef
dbb0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
dbc0: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72  * .** If the str
dbd0: 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  ing zSignedIdent
dbe0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
dbf0: 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65  ly of alpha-nume
dc00: 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ric.** character
dc10: 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  s, does not begi
dc20: 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61  n with a digit a
dc30: 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  nd is not an SQL
dc40: 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65   keyword,.** the
dc50: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  n it is copied t
dc60: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
dc70: 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69  fer exactly as i
dc80: 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  t is. Otherwise,
dc90: 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64  .** it is quoted
dca0: 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75   using double-qu
dcb0: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
dcc0: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
dcd0: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
dce0: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
dcf0: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
dd00: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
dd10: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
dd20: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
dd30: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
dd40: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
dd50: 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  x;..  for(j=0; z
dd60: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
dd70: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
dd80: 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  Isalnum(zIdent[j
dd90: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
dda0: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
ddb0: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
ddc0: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
ddd0: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
dde0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
ddf0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
de00: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20  nt, j)!=TK_ID.  
de10: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64            || zId
de20: 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20  ent[j]!=0.      
de30: 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a        || j==0;..
de40: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
de50: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
de60: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
de70: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
de80: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
de90: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
dea0: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
deb0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
dec0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
ded0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
dee0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
def0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
df00: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
df10: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
df20: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
df30: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
df40: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
df50: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
df60: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
df70: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
df80: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
df90: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
dfa0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
dfb0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
dfc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
dfd0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
dfe0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
dff0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
e000: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
e010: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
e020: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
e030: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e040: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
e050: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
e060: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
e070: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
e080: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
e090: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
e0a0: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
e0b0: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
e0c0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
e0d0: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
e0e0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
e0f0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
e100: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
e110: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
e120: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
e130: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
e140: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
e150: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
e160: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
e170: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
e180: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
e190: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Stmt==0 ){.    s
e1a0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
e1b0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
e1c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
e1d0: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
e1e0: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
e1f0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
e200: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
e210: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
e220: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
e230: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
e240: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
e250: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
e260: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
e270: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
e280: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e290: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
e2a0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
e2b0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
e2c0: 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20     */ "",.      
e2d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
e2e0: 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58  TEXT    */ " TEX
e2f0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
e300: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
e310: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
e320: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
e330: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
e340: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
e350: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
e360: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
e370: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
e380: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
e390: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
e3a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e3b0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
e3c0: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
e3d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e3e0: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
e3f0: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
e400: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
e410: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
e420: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
e430: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
e440: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e  QLITE_AFF_BLOB >
e450: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
e460: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
e470: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  y-SQLITE_AFF_BLO
e480: 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a  B < ArraySize(az
e490: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73  Type) );.    tes
e4a0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
e4b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
e4c0: 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65  F_BLOB );.    te
e4d0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
e4e0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
e4f0: 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74  FF_TEXT );.    t
e500: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
e510: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
e520: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
e530: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
e540: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
e550: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
e560: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
e570: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
e580: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
e590: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
e5a0: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
e5b0: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
e5c0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20  ITE_AFF_BLOB];. 
e5d0: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
e5e0: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
e5f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
e600: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
e610: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20  ITE_AFF_BLOB .  
e620: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
e630: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
e640: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
e650: 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20  (zType, 0) );.  
e660: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
e670: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
e680: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
e690: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
e6a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
e6b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
e6c0: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
e6d0: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
e6e0: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
e6f0: 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20  Resize an Index 
e700: 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e  object to hold N
e710: 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20   columns total. 
e720: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e730: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
e740: 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  and SQLITE_NOMEM
e750: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   on an OOM error
e760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e770: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e780: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  t(sqlite3 *db, I
e790: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
e7a0: 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74  N){.  char *zExt
e7b0: 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ra;.  int nByte;
e7c0: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f  .  if( pIdx->nCo
e7d0: 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e  lumn>=N ) return
e7e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
e7f0: 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65  sert( pIdx->isRe
e800: 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42  sized==0 );.  nB
e810: 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68  yte = (sizeof(ch
e820: 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31  ar*) + sizeof(i1
e830: 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78  6) + 1)*N;.  zEx
e840: 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tra = sqlite3DbM
e850: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
e860: 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74  yte);.  if( zExt
e870: 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ra==0 ) return S
e880: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
e890: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
e8a0: 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c  a, pIdx->azColl,
e8b0: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70   sizeof(char*)*p
e8c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
e8d0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
e8e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 7a 45  (const char**)zE
e8f0: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
e900: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  = sizeof(char*)*
e910: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
e920: 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ra, pIdx->aiColu
e930: 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a  mn, sizeof(i16)*
e940: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
e950: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
e960: 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b   = (i16*)zExtra;
e970: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
e980: 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65  eof(i16)*N;.  me
e990: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
e9a0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70  x->aSortOrder, p
e9b0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
e9c0: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
e9d0: 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b  r = (u8*)zExtra;
e9e0: 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
e9f0: 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73   = N;.  pIdx->is
ea00: 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72  Resized = 1;.  r
ea10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ea20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
ea30: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77  te the total row
ea40: 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62   width for a tab
ea50: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
ea60: 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  id estimateTable
ea70: 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61  Width(Table *pTa
ea80: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  b){.  unsigned w
ea90: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e  Table = 0;.  con
eaa0: 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43  st Column *pTabC
eab0: 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  ol;.  int i;.  f
eac0: 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  or(i=pTab->nCol,
ead0: 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
eae0: 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  Col; i>0; i--, p
eaf0: 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77  TabCol++){.    w
eb00: 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c  Table += pTabCol
eb10: 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69  ->szEst;.  }.  i
eb20: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  f( pTab->iPKey<0
eb30: 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70   ) wTable++;.  p
eb40: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
eb50: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54  sqlite3LogEst(wT
eb60: 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  able*4);.}../*.*
eb70: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
eb80: 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61  verage size of a
eb90: 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65   row for an inde
eba0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
ebb0: 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  d estimateIndexW
ebc0: 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78  idth(Index *pIdx
ebd0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49  ){.  unsigned wI
ebe0: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ndex = 0;.  int 
ebf0: 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  i;.  const Colum
ec00: 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  n *aCol = pIdx->
ec10: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20  pTable->aCol;.  
ec20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
ec30: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
ec40: 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78      i16 x = pIdx
ec50: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
ec60: 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64     assert( x<pId
ec70: 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  x->pTable->nCol 
ec80: 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d  );.    wIndex +=
ec90: 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b   x<0 ? 1 : aCol[
eca0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
ecb0: 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  ]].szEst;.  }.  
ecc0: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d  pIdx->szIdxRow =
ecd0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
ece0: 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20  Index*4);.}../* 
ecf0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 63  Return true if c
ed00: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 78 20 69  olumn number x i
ed10: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72  s any of the fir
ed20: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20  st nCol entries 
ed30: 6f 66 20 61 69 43 6f 6c 5b 5d 2e 0a 2a 2a 20 54  of aiCol[]..** T
ed40: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 64  his is used to d
ed50: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ed60: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 78 20  column number x 
ed70: 61 70 70 65 61 72 73 20 69 6e 20 61 6e 79 20 6f  appears in any o
ed80: 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  f the.** first n
ed90: 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61  Col entries of a
eda0: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  n index..*/.stat
edb0: 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e  ic int hasColumn
edc0: 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f  (const i16 *aiCo
edd0: 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74  l, int nCol, int
ede0: 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43   x){.  while( nC
edf0: 6f 6c 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20  ol-- > 0 ){.    
ee00: 61 73 73 65 72 74 28 20 61 69 43 6f 6c 5b 30 5d  assert( aiCol[0]
ee10: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 78  >=0 );.    if( x
ee20: 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 7b 0a  ==*(aiCol++) ){.
ee30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ee40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ee50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
ee60: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
ee70: 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e  y of the first n
ee80: 4b 65 79 20 65 6e 74 72 69 65 73 20 6f 66 20 69  Key entries of i
ee90: 6e 64 65 78 20 70 49 64 78 20 65 78 61 63 74 6c  ndex pIdx exactl
eea0: 79 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 69  y.** match the i
eeb0: 43 6f 6c 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  Col-th entry of 
eec0: 70 50 6b 2e 20 20 70 50 6b 20 69 73 20 61 6c 77  pPk.  pPk is alw
eed0: 61 79 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  ays a WITHOUT RO
eee0: 57 49 44 0a 2a 2a 20 50 52 49 4d 41 52 59 20 4b  WID.** PRIMARY K
eef0: 45 59 20 69 6e 64 65 78 2e 20 20 70 49 64 78 20  EY index.  pIdx 
ef00: 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74  is an index on t
ef10: 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
ef20: 70 49 64 78 20 6d 61 79 0a 2a 2a 20 6f 72 20 6d  pIdx may.** or m
ef30: 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 73 61  ay not be the sa
ef40: 6d 65 20 69 6e 64 65 78 20 61 73 20 70 50 6b 2e  me index as pPk.
ef50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
ef60: 20 6e 4b 65 79 20 65 6e 74 72 69 65 73 20 6f 66   nKey entries of
ef70: 20 70 49 64 78 20 61 72 65 20 67 75 61 72 61 6e   pIdx are guaran
ef80: 74 65 65 64 20 74 6f 20 62 65 20 6f 72 64 69 6e  teed to be ordin
ef90: 61 72 79 20 63 6f 6c 75 6d 6e 73 2c 0a 2a 2a 20  ary columns,.** 
efa0: 6e 6f 74 20 61 20 72 6f 77 69 64 20 6f 72 20 65  not a rowid or e
efb0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
efc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69   This routine di
efd0: 66 66 65 72 73 20 66 72 6f 6d 20 68 61 73 43 6f  ffers from hasCo
efe0: 6c 75 6d 6e 28 29 20 69 6e 20 74 68 61 74 20 62  lumn() in that b
eff0: 6f 74 68 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  oth the column a
f000: 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6c 6c 61 74  nd the.** collat
f010: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 75 73  ing sequence mus
f020: 74 20 6d 61 74 63 68 20 66 6f 72 20 74 68 69 73  t match for this
f030: 20 72 6f 75 74 69 6e 65 2c 20 62 75 74 20 66 6f   routine, but fo
f040: 72 20 68 61 73 43 6f 6c 75 6d 6e 28 29 20 6f 6e  r hasColumn() on
f050: 6c 79 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  ly.** the column
f060: 20 6e 61 6d 65 20 6d 75 73 74 20 6d 61 74 63 68   name must match
f070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f080: 69 73 44 75 70 43 6f 6c 75 6d 6e 28 49 6e 64 65  isDupColumn(Inde
f090: 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 6e 4b 65  x *pIdx, int nKe
f0a0: 79 2c 20 49 6e 64 65 78 20 2a 70 50 6b 2c 20 69  y, Index *pPk, i
f0b0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
f0c0: 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  i, j;.  assert( 
f0d0: 6e 4b 65 79 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c  nKey<=pIdx->nCol
f0e0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
f0f0: 20 69 43 6f 6c 3c 4d 41 58 28 70 50 6b 2d 3e 6e   iCol<MAX(pPk->n
f100: 43 6f 6c 75 6d 6e 2c 70 50 6b 2d 3e 6e 4b 65 79  Column,pPk->nKey
f110: 43 6f 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Col) );.  assert
f120: 28 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 3d 3d  ( pPk->idxType==
f130: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50  SQLITE_IDXTYPE_P
f140: 52 49 4d 41 52 59 4b 45 59 20 29 3b 0a 20 20 61  RIMARYKEY );.  a
f150: 73 73 65 72 74 28 20 70 50 6b 2d 3e 70 54 61 62  ssert( pPk->pTab
f160: 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  le->tabFlags & T
f170: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
f180: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d  ;.  assert( pPk-
f190: 3e 70 54 61 62 6c 65 3d 3d 70 49 64 78 2d 3e 70  >pTable==pIdx->p
f1a0: 54 61 62 6c 65 20 29 3b 0a 20 20 74 65 73 74 63  Table );.  testc
f1b0: 61 73 65 28 20 70 50 6b 3d 3d 70 49 64 78 20 29  ase( pPk==pIdx )
f1c0: 3b 0a 20 20 6a 20 3d 20 70 50 6b 2d 3e 61 69 43  ;.  j = pPk->aiC
f1d0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a 20 20 61  olumn[iCol];.  a
f1e0: 73 73 65 72 74 28 20 6a 21 3d 58 4e 5f 52 4f 57  ssert( j!=XN_ROW
f1f0: 49 44 20 26 26 20 6a 21 3d 58 4e 5f 45 58 50 52  ID && j!=XN_EXPR
f200: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
f210: 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nKey; i++){.   
f220: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
f230: 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 7c 7c  iColumn[i]>=0 ||
f240: 20 6a 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   j>=0 );.    if(
f250: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
f260: 69 5d 3d 3d 6a 20 0a 20 20 20 20 20 26 26 20 73  i]==j .     && s
f270: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
f280: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 2c 20 70  dx->azColl[i], p
f290: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  Pk->azColl[iCol]
f2a0: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
f2b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f2c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
f2d0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 6f 6d 70 75 74  ;.}../* Recomput
f2e0: 65 20 74 68 65 20 63 6f 6c 4e 6f 74 49 64 78 65  e the colNotIdxe
f2f0: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 49  d field of the I
f300: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 63 6f 6c 4e  ndex..**.** colN
f310: 6f 74 49 64 78 65 64 20 69 73 20 61 20 62 69 74  otIdxed is a bit
f320: 6d 61 73 6b 20 74 68 61 74 20 68 61 73 20 61 20  mask that has a 
f330: 30 20 62 69 74 20 72 65 70 72 65 73 65 6e 74 69  0 bit representi
f340: 6e 67 20 65 61 63 68 20 69 6e 64 65 78 65 64 0a  ng each indexed.
f350: 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  ** columns that 
f360: 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 66  are within the f
f370: 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20  irst 63 columns 
f380: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
f390: 68 65 0a 2a 2a 20 68 69 67 68 2d 6f 72 64 65 72  he.** high-order
f3a0: 20 62 69 74 20 6f 66 20 63 6f 6c 4e 6f 74 49 64   bit of colNotId
f3b0: 78 65 64 20 69 73 20 61 6c 77 61 79 73 20 31 2e  xed is always 1.
f3c0: 20 20 41 6c 6c 20 75 6e 69 6e 64 65 78 65 64 20    All unindexed 
f3d0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
f3e0: 65 20 74 61 62 6c 65 20 68 61 76 65 20 61 20 31  e table have a 1
f3f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 4e  ..**.** The colN
f400: 6f 74 49 64 78 65 64 20 6d 61 73 6b 20 69 73 20  otIdxed mask is 
f410: 41 4e 44 2d 65 64 20 77 69 74 68 20 74 68 65 20  AND-ed with the 
f420: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
f430: 73 65 64 20 6d 61 73 6b 0a 2a 2a 20 74 6f 20 64  sed mask.** to d
f440: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
f450: 69 6e 64 65 78 20 69 73 20 63 6f 76 65 72 69 6e  index is coverin
f460: 67 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  g index..*/.stat
f470: 69 63 20 76 6f 69 64 20 72 65 63 6f 6d 70 75 74  ic void recomput
f480: 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78  eColumnsNotIndex
f490: 65 64 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  ed(Index *pIdx){
f4a0: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30  .  Bitmask m = 0
f4b0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
f4c0: 28 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  (j=pIdx->nColumn
f4d0: 2d 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a  -1; j>=0; j--){.
f4e0: 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78      int x = pIdx
f4f0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
f500: 20 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20     if( x>=0 ){. 
f510: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
f520: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
f530: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
f540: 53 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  S-2 );.      if(
f550: 20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20   x<BMS-1 ) m |= 
f560: 4d 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20  MASKBIT(x);.    
f570: 7d 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 63 6f  }.  }.  pIdx->co
f580: 6c 4e 6f 74 49 64 78 65 64 20 3d 20 7e 6d 3b 0a  lNotIdxed = ~m;.
f590: 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 2d    assert( (pIdx-
f5a0: 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 3e 3e 36 33  >colNotIdxed>>63
f5b0: 29 3d 3d 31 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )==1 );.}../*.**
f5c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
f5d0: 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ns at the end of
f5e0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
f5f0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
f600: 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20  t that.** has a 
f610: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c  WITHOUT ROWID cl
f620: 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f  ause.  The job o
f630: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
f640: 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74  s to convert bot
f650: 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63  h.** internal sc
f660: 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74  hema data struct
f670: 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e  ures and the gen
f680: 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65  erated VDBE code
f690: 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a   so that they.**
f6a0: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
f6b0: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
f6c0: 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65  OWID table inste
f6d0: 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61  ad of a rowid ta
f6e0: 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20  ble..** Changes 
f6f0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
f700: 20 20 20 28 31 29 20 20 53 65 74 20 61 6c 6c 20     (1)  Set all 
f710: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50  columns of the P
f720: 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68 65 6d  RIMARY KEY schem
f730: 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 4e  a object to be N
f740: 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20  OT NULL..**     
f750: 28 32 29 20 20 43 6f 6e 76 65 72 74 20 50 33 20  (2)  Convert P3 
f760: 70 61 72 61 6d 65 74 65 72 20 6f 66 20 74 68 65  parameter of the
f770: 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 20   OP_CreateBtree 
f780: 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e 54 4b 45  from BTREE_INTKE
f790: 59 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  Y .**          i
f7a0: 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45  nto BTREE_BLOBKE
f7b0: 59 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 42  Y..**     (3)  B
f7c0: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
f7d0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
f7e0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
f7f0: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
f800: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
f810: 4b 45 59 20 61 73 20 74 68 65 20 70 72 69 6d 61  KEY as the prima
f820: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20  ry key index is 
f830: 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
f840: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
f850: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
f860: 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74  table entry of t
f870: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
f880: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
f890: 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20   the Index.tnum 
f8a0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
f8b0: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  EY Index object 
f8c0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
f8d0: 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65     schema to the
f8e0: 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74   rootpage from t
f8f0: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
f900: 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61  *     (5)  Add a
f910: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
f920: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
f930: 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  KEY Index object
f940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20  .**          so 
f950: 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59  that the PRIMARY
f960: 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69   KEY is a coveri
f970: 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73  ng index.  The s
f980: 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20  urplus.**       
f990: 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70     columns are p
f9a0: 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e  art of KeyInfo.n
f9b0: 41 6c 6c 46 69 65 6c 64 20 61 6e 64 20 61 72 65  AllField and are
f9c0: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a   not used for.**
f9d0: 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e            sortin
f9e0: 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75  g or lookup or u
f9f0: 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73  niqueness checks
fa00: 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65  ..**     (6)  Re
fa10: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20  place the rowid 
fa20: 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f  tail on all auto
fa30: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
fa40: 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  ted UNIQUE.**   
fa50: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77         indices w
fa60: 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20  ith the PRIMARY 
fa70: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a  KEY columns..**.
fa80: 2a 2a 20 46 6f 72 20 76 69 72 74 75 61 6c 20 74  ** For virtual t
fa90: 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 28 31 29 20  ables, only (1) 
faa0: 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f  is performed..*/
fab0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e  .static void con
fac0: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
fad0: 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  idTable(Parse *p
fae0: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
faf0: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ab){.  Index *pI
fb00: 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b  dx;.  Index *pPk
fb10: 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69  ;.  int nPk;.  i
fb20: 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 69 6e 74  nt nExtra;.  int
fb30: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
fb40: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
fb50: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
fb60: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
fb70: 20 2f 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 50   /* Mark every P
fb80: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
fb90: 6e 20 61 73 20 4e 4f 54 20 4e 55 4c 4c 20 28 65  n as NOT NULL (e
fba0: 78 63 65 70 74 20 66 6f 72 20 69 6d 70 6f 73 74  xcept for impost
fbb0: 65 72 20 74 61 62 6c 65 73 29 0a 20 20 2a 2f 0a  er tables).  */.
fbc0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
fbd0: 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 7b  imposterTable ){
fbe0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fbf0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
fc00: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  {.      if( (pTa
fc10: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 63 6f 6c 46 6c  b->aCol[i].colFl
fc20: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
fc30: 49 4d 4b 45 59 29 21 3d 30 20 29 7b 0a 20 20 20  IMKEY)!=0 ){.   
fc40: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
fc50: 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 4f 45 5f  i].notNull = OE_
fc60: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
fc70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
fc80: 6f 6e 76 65 72 74 20 74 68 65 20 50 33 20 6f 70  onvert the P3 op
fc90: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
fca0: 43 72 65 61 74 65 42 74 72 65 65 20 6f 70 63 6f  CreateBtree opco
fcb0: 64 65 20 66 72 6f 6d 20 42 54 52 45 45 5f 49 4e  de from BTREE_IN
fcc0: 54 4b 45 59 0a 20 20 2a 2a 20 69 6e 74 6f 20 42  TKEY.  ** into B
fcd0: 54 52 45 45 5f 42 4c 4f 42 4b 45 59 2e 0a 20 20  TREE_BLOBKEY..  
fce0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
fcf0: 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20  >addrCrTab ){.  
fd00: 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20    assert( v );. 
fd10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
fd20: 61 6e 67 65 50 33 28 76 2c 20 70 50 61 72 73 65  angeP3(v, pParse
fd30: 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 42 54 52  ->addrCrTab, BTR
fd40: 45 45 5f 42 4c 4f 42 4b 45 59 29 3b 0a 20 20 7d  EE_BLOBKEY);.  }
fd50: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
fd60: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
fd70: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
fd80: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
fd90: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
fda0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
fdb0: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
fdc0: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
fdd0: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
fde0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
fdf0: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
fe00: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
fe10: 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b 65 6e 3b   Token ipkToken;
fe20: 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65  .    sqlite3Toke
fe30: 6e 49 6e 69 74 28 26 69 70 6b 54 6f 6b 65 6e 2c  nInit(&ipkToken,
fe40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
fe50: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
fe60: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
fe70: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
fe80: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
feb0: 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69 70  c(db, TK_ID, &ip
fec0: 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  kToken, 0));.   
fed0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
fee0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
fef0: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
ff00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ff10: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
ff20: 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  p(pParse, pList-
ff30: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 26 70 54  >a[0].pExpr, &pT
ff40: 61 62 2d 3e 69 50 4b 65 79 29 3b 0a 20 20 20 20  ab->iPKey);.    
ff50: 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  }.    pList->a[0
ff60: 5d 2e 73 6f 72 74 46 6c 61 67 73 20 3d 20 70 50  ].sortFlags = pP
ff70: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
ff80: 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
ff90: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
ffa0: 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70  e==pTab );.    p
ffb0: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
ffc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
ffd0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
ffe0: 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20  0, 0, 0, pList, 
fff0: 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30  pTab->keyConf, 0
10000 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  , 0, 0, 0,.     
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45    SQLITE_IDXTYPE
10030 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a 20 20  _PRIMARYKEY);.  
10040 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10050 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
10060 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
10070 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
10080 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
10090 78 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73  x(pTab);.    ass
100a0 65 72 74 28 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  ert( pPk->nKeyCo
100b0 6c 3d 3d 31 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==1 );.  }else{
100c0 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
100d0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
100e0 78 28 70 54 61 62 29 3b 0a 20 20 20 20 61 73 73  x(pTab);.    ass
100f0 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 0a  ert( pPk!=0 );..
10100 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
10110 6d 6f 76 65 20 61 6c 6c 20 72 65 64 75 6e 64 61  move all redunda
10120 6e 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  nt columns from 
10130 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
10140 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63    For example, c
10150 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 22 50 52  hange.    ** "PR
10160 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 61 2c  IMARY KEY(a,b,a,
10170 62 2c 63 2c 62 2c 63 2c 64 29 22 20 69 6e 74 6f  b,c,b,c,d)" into
10180 20 6a 75 73 74 20 22 50 52 49 4d 41 52 59 20 4b   just "PRIMARY K
10190 45 59 28 61 2c 62 2c 63 2c 64 29 22 2e 20 20 4c  EY(a,b,c,d)".  L
101a0 61 74 65 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  ater.    ** code
101b0 20 61 73 73 75 6d 65 73 20 74 68 65 20 50 52 49   assumes the PRI
101c0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 74 61 69 6e  MARY KEY contain
101d0 73 20 6e 6f 20 72 65 70 65 61 74 65 64 20 63 6f  s no repeated co
101e0 6c 75 6d 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  lumns..    */.  
101f0 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20 69 3c 70    for(i=j=1; i<p
10200 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  Pk->nKeyCol; i++
10210 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  ){.      if( isD
10220 75 70 43 6f 6c 75 6d 6e 28 70 50 6b 2c 20 6a 2c  upColumn(pPk, j,
10230 20 70 50 6b 2c 20 69 29 20 29 7b 0a 20 20 20 20   pPk, i) ){.    
10240 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e      pPk->nColumn
10250 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
10260 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10270 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  e( hasColumn(pPk
10280 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70  ->aiColumn, j, p
10290 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
102a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
102b0 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
102c0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
102d0 20 20 20 20 20 70 50 6b 2d 3e 61 53 6f 72 74 4f       pPk->aSortO
102e0 72 64 65 72 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  rder[j] = pPk->a
102f0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
10300 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c        pPk->aiCol
10310 75 6d 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e  umn[j++] = pPk->
10320 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
10330 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
10340 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b  Pk->nKeyCol = j;
10350 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10360 50 6b 21 3d 30 20 29 3b 0a 20 20 70 50 6b 2d 3e  Pk!=0 );.  pPk->
10370 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a  isCovering = 1;.
10380 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
10390 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 29 20  imposterTable ) 
103a0 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
103b0 20 3d 20 31 3b 0a 20 20 6e 50 6b 20 3d 20 70 50   = 1;.  nPk = pP
103c0 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b  k->nColumn = pPk
103d0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
103e0 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
103f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  tion of the PRIM
10400 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61 6e  ARY KEY btree an
10410 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  d the sqlite_mas
10420 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65  ter.  ** table e
10430 6e 74 72 79 2e 20 54 68 69 73 20 69 73 20 6f 6e  ntry. This is on
10440 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 20 63  ly required if c
10450 75 72 72 65 6e 74 6c 79 20 67 65 6e 65 72 61 74  urrently generat
10460 69 6e 67 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f  ing VDBE.  ** co
10470 64 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20  de for a CREATE 
10480 54 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20  TABLE (not when 
10490 70 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70  parsing one as p
104a0 61 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20  art of reading. 
104b0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 73   ** a database s
104c0 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66  chema).  */.  if
104d0 28 20 76 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d  ( v && pPk->tnum
104e0 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
104f0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
10500 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
10510 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
10520 65 28 76 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20  e(v, pPk->tnum, 
10530 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20  OP_Goto);.  }.. 
10540 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
10550 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  e of the PRIMARY
10560 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c   KEY is the tabl
10570 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20  e root page */. 
10580 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61   pPk->tnum = pTa
10590 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55  b->tnum;..  /* U
105a0 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  pdate the in-mem
105b0 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
105c0 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45  on of all UNIQUE
105d0 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76   indices by conv
105e0 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  erting.  ** the 
105f0 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75  final rowid colu
10600 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  mn into one or m
10610 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
10620 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  he PRIMARY KEY..
10630 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d    */.  for(pIdx=
10640 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
10650 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
10660 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
10670 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72 69 6d  ;.    if( IsPrim
10680 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78  aryKeyIndex(pIdx
10690 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
106a0 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e    for(i=n=0; i<n
106b0 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Pk; i++){.      
106c0 69 66 28 20 21 69 73 44 75 70 43 6f 6c 75 6d 6e  if( !isDupColumn
106d0 28 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65  (pIdx, pIdx->nKe
106e0 79 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20 29 7b  yCol, pPk, i) ){
106f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10700 65 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  e( hasColumn(pId
10710 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
10720 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
10730 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b  >aiColumn[i]) );
10740 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
10750 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10760 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
10770 20 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20    /* This index 
10780 69 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66  is a superset of
10790 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
107a0 20 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   */.      pIdx->
107b0 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  nColumn = pIdx->
107c0 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63  nKeyCol;.      c
107d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
107e0 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
107f0 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64  exObject(db, pId
10800 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  x, pIdx->nKeyCol
10810 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  +n) ) return;.  
10820 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64    for(i=0, j=pId
10830 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50  x->nKeyCol; i<nP
10840 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; i++){.      i
10850 66 28 20 21 69 73 44 75 70 43 6f 6c 75 6d 6e 28  f( !isDupColumn(
10860 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
10870 43 6f 6c 2c 20 70 50 6b 2c 20 69 29 20 29 7b 0a  Col, pPk, i) ){.
10880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
10890 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78  ( hasColumn(pIdx
108a0 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
108b0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
108c0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 3b 0a  aiColumn[i]) );.
108d0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
108e0 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d  Column[j] = pPk-
108f0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
10900 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
10910 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[j] = pPk->azC
10920 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  oll[i];.        
10930 69 66 28 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  if( pPk->aSortOr
10940 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
10950 20 20 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65      /* See ticke
10960 74 20 68 74 74 70 73 3a 2f 2f 77 77 77 2e 73 71  t https://www.sq
10970 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66  lite.org/src/inf
10980 6f 2f 62 62 61 37 62 36 39 66 39 38 34 39 62 35  o/bba7b69f9849b5
10990 62 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  bf */.          
109a0 70 49 64 78 2d 3e 62 41 73 63 4b 65 79 42 75 67  pIdx->bAscKeyBug
109b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
109c0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
109d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
109e0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
109f0 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
10a00 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
10a10 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
10a20 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
10a30 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
10a40 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
10a50 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
10a60 78 0a 20 20 2a 2f 0a 20 20 6e 45 78 74 72 61 20  x.  */.  nExtra 
10a70 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
10a80 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
10a90 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 68 61 73  +){.    if( !has
10aa0 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f  Column(pPk->aiCo
10ab0 6c 75 6d 6e 2c 20 6e 50 6b 2c 20 69 29 0a 20 20  lumn, nPk, i).  
10ac0 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43 6f     && (pTab->aCo
10ad0 6c 5b 69 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  l[i].colFlags & 
10ae0 43 4f 4c 46 4c 41 47 5f 56 49 52 54 55 41 4c 29  COLFLAG_VIRTUAL)
10af0 3d 3d 30 20 29 20 6e 45 78 74 72 61 2b 2b 3b 0a  ==0 ) nExtra++;.
10b00 20 20 7d 0a 20 20 69 66 28 20 72 65 73 69 7a 65    }.  if( resize
10b10 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
10b20 70 50 6b 2c 20 6e 50 6b 2b 6e 45 78 74 72 61 29  pPk, nPk+nExtra)
10b30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
10b40 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70  (i=0, j=nPk; i<p
10b50 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  Tab->nCol; i++){
10b60 0a 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c  .    if( !hasCol
10b70 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  umn(pPk->aiColum
10b80 6e 2c 20 6a 2c 20 69 29 0a 20 20 20 20 20 26 26  n, j, i).     &&
10b90 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e   (pTab->aCol[i].
10ba0 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
10bb0 41 47 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20  AG_VIRTUAL)==0. 
10bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
10bd0 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
10be0 6d 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 6b 2d  mn );.      pPk-
10bf0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
10c00 3b 0a 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43  ;.      pPk->azC
10c10 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33  oll[j] = sqlite3
10c20 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20  StrBINARY;.     
10c30 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
10c40 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
10c50 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 61  Column==j );.  a
10c60 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 4e 56  ssert( pTab->nNV
10c70 43 6f 6c 3c 3d 6a 20 29 3b 0a 20 20 72 65 63 6f  Col<=j );.  reco
10c80 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 49  mputeColumnsNotI
10c90 6e 64 65 78 65 64 28 70 50 6b 29 3b 0a 7d 0a 0a  ndexed(pPk);.}..
10ca0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10cb0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10cc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
10cd0 75 65 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 61  ue if zName is a
10ce0 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 6e 61   shadow table na
10cf0 6d 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  me in the curren
10d00 74 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  t database.** co
10d10 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
10d20 7a 4e 61 6d 65 20 69 73 20 74 65 6d 70 6f 72 61  zName is tempora
10d30 72 69 6c 79 20 6d 6f 64 69 66 69 65 64 20 77 68  rily modified wh
10d40 69 6c 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ile this routine
10d50 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 62 75 74   is running, but
10d60 20 69 73 0a 2a 2a 20 72 65 73 74 6f 72 65 64 20   is.** restored 
10d70 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
10d80 76 61 6c 75 65 20 70 72 69 6f 72 20 74 6f 20 74  value prior to t
10d90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10da0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
10db0 20 69 6e 74 20 69 73 53 68 61 64 6f 77 54 61 62   int isShadowTab
10dc0 6c 65 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  leName(sqlite3 *
10dd0 64 62 2c 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  db, char *zName)
10de0 7b 0a 20 20 63 68 61 72 20 2a 7a 54 61 69 6c 3b  {.  char *zTail;
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
10e10 74 68 65 20 6c 61 73 74 20 22 5f 22 20 69 6e 20  the last "_" in 
10e20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65  zName */.  Table
10e30 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
10e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
10e50 65 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20  e that zName is 
10e60 61 20 73 68 61 64 6f 77 20 6f 66 20 2a 2f 0a 20  a shadow of */. 
10e70 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 3b 20 20   Module *pMod;  
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e90 2a 20 4d 6f 64 75 6c 65 20 66 6f 72 20 74 68 65  * Module for the
10ea0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
10eb0 2f 0a 0a 20 20 7a 54 61 69 6c 20 3d 20 73 74 72  /..  zTail = str
10ec0 72 63 68 72 28 7a 4e 61 6d 65 2c 20 27 5f 27 29  rchr(zName, '_')
10ed0 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 3d 3d 30  ;.  if( zTail==0
10ee0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2a   ) return 0;.  *
10ef0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 70 54 61  zTail = 0;.  pTa
10f00 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
10f10 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
10f20 30 29 3b 0a 20 20 2a 7a 54 61 69 6c 20 3d 20 27  0);.  *zTail = '
10f30 5f 27 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  _';.  if( pTab==
10f40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
10f50 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
10f60 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
10f70 0a 20 20 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  .  pMod = (Modul
10f80 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
10f90 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c  nd(&db->aModule,
10fa0 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41   pTab->azModuleA
10fb0 72 67 5b 30 5d 29 3b 0a 20 20 69 66 28 20 70 4d  rg[0]);.  if( pM
10fc0 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  od==0 ) return 0
10fd0 3b 0a 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 4d  ;.  if( pMod->pM
10fe0 6f 64 75 6c 65 2d 3e 69 56 65 72 73 69 6f 6e 3c  odule->iVersion<
10ff0 33 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  3 ) return 0;.  
11000 69 66 28 20 70 4d 6f 64 2d 3e 70 4d 6f 64 75 6c  if( pMod->pModul
11010 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d 65 3d 3d  e->xShadowName==
11020 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
11030 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 4d 6f  return pMod->pMo
11040 64 75 6c 65 2d 3e 78 53 68 61 64 6f 77 4e 61 6d  dule->xShadowNam
11050 65 28 7a 54 61 69 6c 2b 31 29 3b 0a 7d 0a 23 65  e(zTail+1);.}.#e
11060 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 69 73 53  lse.# define isS
11070 68 61 64 6f 77 54 61 62 6c 65 4e 61 6d 65 28 78  hadowTableName(x
11080 2c 79 29 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y) 0.#endif /* 
11090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
110a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
110b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
110c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
110d0 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66   to report the f
110e0 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20 74 65  inal ")" that te
110f0 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52  rminates.** a CR
11100 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
11110 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
11120 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
11130 74 68 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f  that other actio
11140 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  n routines have 
11150 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a  been building.**
11160 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
11170 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74   internal hash t
11180 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20  ables, assuming 
11190 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a  no errors have.*
111a0 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a  * occurred..**.*
111b0 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74  * An entry for t
111c0 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65  he table is made
111d0 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74   in the master t
111e0 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e  able on disk, un
111f0 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20  less.** this is 
11200 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
11210 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75  e or db->init.bu
11220 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d  sy==1.  When db-
11230 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a  >init.busy==1.**
11240 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
11250 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
11260 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
11270 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
11280 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f  .** connected to
11290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
112a0 20 62 65 63 61 75 73 65 20 74 68 65 20 73 71 6c   because the sql
112b0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
112c0 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79   has.** recently
112d0 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65   changed, so the
112e0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20   entry for this 
112f0 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
11300 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ists in.** the s
11310 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11320 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77  le.  We do not w
11330 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20 69 74  ant to create it
11340 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66   again..**.** If
11350 20 74 68 65 20 70 53 65 6c 65 63 74 20 61 72 67   the pSelect arg
11360 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
11370 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
11380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
11390 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63   was called to c
113a0 72 65 61 74 65 20 61 20 74 61 62 6c 65 20 67 65  reate a table ge
113b0 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a  nerated from a .
113c0 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ** "CREATE TABLE
113d0 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e   ... AS SELECT .
113e0 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  .." statement.  
113f0 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  The column names
11400 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74   of.** the new t
11410 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20  able will match 
11420 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
11430 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  f the SELECT..*/
11440 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64  .void sqlite3End
11450 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
11460 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
11470 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
11480 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  t */.  Token *pC
11490 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ons,           /
114a0 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20  * The ',' token 
114b0 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 63  after the last c
114c0 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20  olumn defn. */. 
114d0 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20   Token *pEnd,   
114e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
114f0 27 29 27 20 62 65 66 6f 72 65 20 6f 70 74 69 6f  ')' before optio
11500 6e 73 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  ns in the CREATE
11510 20 54 41 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74   TABLE */.  u8 t
11520 61 62 4f 70 74 73 2c 20 20 20 20 20 20 20 20 20  abOpts,         
11530 20 20 20 20 2f 2a 20 45 78 74 72 61 20 74 61 62      /* Extra tab
11540 6c 65 20 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61  le options. Usua
11550 6c 6c 79 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65  lly 0. */.  Sele
11560 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
11570 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72      /* Select fr
11580 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e  om a "CREATE ...
11590 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29   AS SELECT" */.)
115a0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 20 20 20  {.  Table *p;   
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
115c0 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a   The new table *
115d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
115e0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
115f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
11600 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
11610 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
11620 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
11630 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 68 65  ase in which the
11640 20 74 61 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a   table lives */.
11650 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
11660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11670 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
11680 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
11690 0a 20 20 69 66 28 20 70 45 6e 64 3d 3d 30 20 26  .  if( pEnd==0 &
116a0 26 20 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  & pSelect==0 ){.
116b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
116c0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
116d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
116e0 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
116f0 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
11700 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
11710 69 66 28 20 70 53 65 6c 65 63 74 3d 3d 30 20 26  if( pSelect==0 &
11720 26 20 69 73 53 68 61 64 6f 77 54 61 62 6c 65 4e  & isShadowTableN
11730 61 6d 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  ame(db, p->zName
11740 29 20 29 7b 0a 20 20 20 20 70 2d 3e 74 61 62 46  ) ){.    p->tabF
11750 6c 61 67 73 20 7c 3d 20 54 46 5f 53 68 61 64 6f  lags |= TF_Shado
11760 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  w;.  }..  /* If 
11770 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
11780 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
11790 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
117a0 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
117b0 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
117c0 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
117d0 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
117e0 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
117f0 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
11800 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
11810 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
11820 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
11830 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
11840 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
11850 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
11860 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
11870 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
11880 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
11890 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
118a0 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
118b0 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2a 0a 20 20  outine.).  **.  
118c0 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
118d0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 31 2c  age number is 1,
118e0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 69 73   that means this
118f0 20 69 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   is the sqlite_m
11900 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65  aster.  ** table
11910 20 69 74 73 65 6c 66 2e 20 20 53 6f 20 6d 61 72   itself.  So mar
11920 6b 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a  k it read-only..
11930 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
11940 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
11950 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
11960 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 22 29  rMsg(pParse, "")
11980 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
11990 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 6e 75      }.    p->tnu
119a0 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
119b0 54 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d  Tnum;.    if( p-
119c0 3e 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61  >tnum==1 ) p->ta
119d0 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61  bFlags |= TF_Rea
119e0 64 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 61 73  donly;.  }..  as
119f0 73 65 72 74 28 20 28 70 2d 3e 74 61 62 46 6c 61  sert( (p->tabFla
11a00 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
11a10 72 79 4b 65 79 29 3d 3d 30 0a 20 20 20 20 20 20  ryKey)==0.      
11a20 20 7c 7c 20 70 2d 3e 69 50 4b 65 79 3e 3d 30 20   || p->iPKey>=0 
11a30 7c 7c 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72  || sqlite3Primar
11a40 79 4b 65 79 49 6e 64 65 78 28 70 29 21 3d 30 20  yKeyIndex(p)!=0 
11a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
11a60 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
11a70 61 73 50 72 69 6d 61 72 79 4b 65 79 29 21 3d 30  asPrimaryKey)!=0
11a80 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 2d 3e 69  .       || (p->i
11a90 50 4b 65 79 3c 30 20 26 26 20 73 71 6c 69 74 65  PKey<0 && sqlite
11aa0 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
11ab0 28 70 29 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  (p)==0) );..  /*
11ac0 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
11ad0 69 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20  ing for WITHOUT 
11ae0 52 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a  ROWID Tables */.
11af0 20 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20    if( tabOpts & 
11b00 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
11b10 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74  ){.    if( (p->t
11b20 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
11b30 6f 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20  oincrement) ){. 
11b40 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11b50 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
11b60 20 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52         "AUTOINCR
11b70 45 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65  EMENT not allowe
11b80 64 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57  d on WITHOUT ROW
11b90 49 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ID tables");.   
11ba0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
11bb0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
11bc0 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
11bd0 69 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a  imaryKey)==0 ){.
11be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
11bf0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50  orMsg(pParse, "P
11c00 52 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69  RIMARY KEY missi
11c10 6e 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c  ng on table %s",
11c20 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
11c30 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
11c40 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73 20      p->tabFlags 
11c50 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f 77  |= TF_WithoutRow
11c60 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  id | TF_NoVisibl
11c70 65 52 6f 77 69 64 3b 0a 20 20 20 20 63 6f 6e 76  eRowid;.    conv
11c80 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
11c90 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
11ca0 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  );.  }.  iDb = s
11cb0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
11cc0 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
11cd0 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
11ce0 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
11cf0 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
11d00 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20  es in all CHECK 
11d10 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
11d20 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ssions..  */.  i
11d30 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a  f( p->pCheck ){.
11d40 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
11d50 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
11d60 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73  pParse, p, NC_Is
11d70 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68  Check, 0, p->pCh
11d80 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eck);.  }.#endif
11d90 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
11da0 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
11db0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
11dc0 45 5f 4f 4d 49 54 5f 47 45 4e 45 52 41 54 45 44  E_OMIT_GENERATED
11dd0 5f 43 4f 4c 55 4d 4e 53 0a 20 20 69 66 28 20 70  _COLUMNS.  if( p
11de0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
11df0 48 61 73 47 65 6e 65 72 61 74 65 64 20 29 7b 0a  HasGenerated ){.
11e00 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
11e10 74 65 73 74 63 61 73 65 28 20 70 2d 3e 74 61 62  testcase( p->tab
11e20 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 56 69  Flags & TF_HasVi
11e30 72 74 75 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  rtual );.    tes
11e40 74 63 61 73 65 28 20 70 2d 3e 74 61 62 46 6c 61  tcase( p->tabFla
11e50 67 73 20 26 20 54 46 5f 48 61 73 53 74 6f 72 65  gs & TF_HasStore
11e60 64 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  d );.    for(ii=
11e70 30 3b 20 69 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  0; ii<p->nCol; i
11e80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 33 32 20  i++){.      u32 
11e90 63 6f 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 61 43  colFlags = p->aC
11ea0 6f 6c 5b 69 69 5d 2e 63 6f 6c 46 6c 61 67 73 3b  ol[ii].colFlags;
11eb0 0a 20 20 20 20 20 20 69 66 28 20 28 63 6f 6c 46  .      if( (colF
11ec0 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 47  lags & COLFLAG_G
11ed0 45 4e 45 52 41 54 45 44 29 21 3d 30 20 29 7b 0a  ENERATED)!=0 ){.
11ee0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
11ef0 28 20 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ( colFlags & COL
11f00 46 4c 41 47 5f 56 49 52 54 55 41 4c 20 29 3b 0a  FLAG_VIRTUAL );.
11f10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
11f20 28 20 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ( colFlags & COL
11f30 46 4c 41 47 5f 53 54 4f 52 45 44 20 29 3b 0a 20  FLAG_STORED );. 
11f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
11f50 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
11f60 63 65 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43  ce(pParse, p, NC
11f70 5f 47 65 6e 43 6f 6c 2c 20 0a 20 20 20 20 20 20  _GenCol, .      
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
11fa0 3e 61 43 6f 6c 5b 69 69 5d 2e 70 44 66 6c 74 2c  >aCol[ii].pDflt,
11fb0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
11fc0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
11fd0 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
11fe0 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
11ff0 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
12000 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
12010 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
12020 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
12030 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
12040 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
12050 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
12060 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
12070 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
12080 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
12090 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
120a0 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
120b0 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
120c0 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
120d0 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
120e0 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
120f0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
12100 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
12110 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
12120 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
12130 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
12140 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
12150 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
12160 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12170 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
12180 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
12190 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
121a0 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
121b0 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
121c0 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
121d0 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
121e0 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
121f0 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
12200 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
12210 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
12220 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
12230 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
12240 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
12250 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
12260 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
12270 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
12280 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
12290 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
122a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
122b0 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
122c0 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
122d0 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
122e0 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
122f0 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
12300 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
12310 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
12320 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
12330 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
12340 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
12350 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
12360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12370 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
12380 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
12390 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
123a0 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
123b0 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
123c0 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
123d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
123e0 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
123f0 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
12400 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
12410 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
12420 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
12430 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
12440 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
12450 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
12460 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
12470 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
12480 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
12490 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
124a0 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
124b0 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
124c0 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
124d0 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
124e0 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
124f0 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
12500 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
12510 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
12520 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
12530 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
12540 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
12550 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
12560 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
12570 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
12580 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
12590 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
125a0 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
125b0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
125c0 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
125d0 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
125e0 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
125f0 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
12600 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
12610 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
12620 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
12630 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
12640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12650 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
12660 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
12670 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68  ;    /* Where th
12680 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20  e SELECT should 
12690 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f  store results */
126a0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69  .      int regYi
126b0 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  eld;       /* Re
126c0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63  gister holding c
126d0 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d  o-routine entry-
126e0 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  point */.      i
126f0 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20  nt addrTop;     
12700 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
12710 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   co-routine */. 
12720 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b       int regRec;
12730 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65           /* A re
12740 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72  cord to be inser
12750 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74  t into the new t
12760 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  able */.      in
12770 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20  t regRowid;     
12780 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68    /* Rowid of th
12790 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e  e next row to in
127a0 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  sert */.      in
127b0 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20  t addrInsLoop;  
127c0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
127d0 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69  loop for inserti
127e0 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20  ng rows */.     
127f0 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b   Table *pSelTab;
12800 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
12810 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
12820 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  he SELECT result
12830 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59  s */..      regY
12840 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ield = ++pParse-
12850 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
12860 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Rec = ++pParse->
12870 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
12880 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
12890 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  >nMem;.      ass
128a0 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
128b0 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
128c0 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
128d0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
128e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
128f0 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
12900 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
12910 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
12920 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12930 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
12940 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
12950 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
12960 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
12970 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12980 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20  Addr(v) + 1;.   
12990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
129a0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
129b0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
129c0 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  ld, 0, addrTop);
129d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
129e0 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
129f0 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20  ;.      pSelTab 
12a00 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
12a10 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
12a20 65 2c 20 70 53 65 6c 65 63 74 2c 20 53 51 4c 49  e, pSelect, SQLI
12a30 54 45 5f 41 46 46 5f 42 4c 4f 42 29 3b 0a 20 20  TE_AFF_BLOB);.  
12a40 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d      if( pSelTab=
12a50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
12a60 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
12a70 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
12a80 2d 3e 6e 43 6f 6c 20 3d 20 70 2d 3e 6e 4e 56 43  ->nCol = p->nNVC
12a90 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
12aa0 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f  ol;.      p->aCo
12ab0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
12ac0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
12ad0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
12ae0 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
12af0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
12b00 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
12b10 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
12b20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
12b30 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53  estInit(&dest, S
12b40 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
12b50 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73  gYield);.      s
12b60 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
12b70 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
12b80 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
12b90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
12ba0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 73 71 6c  eturn;.      sql
12bb0 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
12bc0 74 69 6e 65 28 76 2c 20 72 65 67 59 69 65 6c 64  tine(v, regYield
12bd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12be0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12bf0 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20  addrTop - 1);.  
12c00 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
12c10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12c20 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
12c30 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
12c40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12c50 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
12c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12c70 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
12c80 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
12c90 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
12ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
12cb0 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
12cc0 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
12cd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12ce0 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
12cf0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
12d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d10 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
12d20 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
12d30 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
12d40 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
12d50 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
12d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12d70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
12d80 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
12d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12da0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
12db0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
12dc0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
12dd0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
12de0 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
12df0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
12e00 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
12e10 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
12e20 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
12e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e40 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
12e50 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
12e60 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
12e70 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
12e80 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
12e90 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
12ea0 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
12eb0 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
12ec0 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
12ed0 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
12ee0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
12ef0 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
12f00 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
12f10 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
12f20 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
12f30 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
12f40 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
12f50 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
12f60 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
12f70 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
12f80 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
12f90 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
12fa0 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
12fb0 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
12fc0 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
12fd0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
12fe0 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
12ff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
13000 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
13010 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
13020 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
13030 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
13040 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
13050 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
13060 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
13070 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
13080 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
13090 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
130a0 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52  zDbSName, MASTER
130b0 5f 4e 41 4d 45 2c 0a 20 20 20 20 20 20 7a 54 79  _NAME,.      zTy
130c0 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  pe,.      p->zNa
130d0 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61  me,.      p->zNa
130e0 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  me,.      pParse
130f0 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20  ->regRoot,.     
13100 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50   zStmt,.      pP
13110 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20  arse->regRowid. 
13120 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
13130 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
13140 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  t);.    sqlite3C
13150 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
13160 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64  se, iDb);..#ifnd
13170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13180 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20  UTOINCREMENT.   
13190 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
131a0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63   if we need to c
131b0 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f  reate an sqlite_
131c0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66  sequence table f
131d0 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e  or.    ** keepin
131e0 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69  g track of autoi
131f0 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20  ncrement keys.. 
13200 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
13210 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
13220 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
13230 30 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70  0 ){.      Db *p
13240 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
13250 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b];.      assert
13260 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
13270 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
13280 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66  , 0) );.      if
13290 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  ( pDb->pSchema->
132a0 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20  pSeqTab==0 ){.  
132b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
132c0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
132d0 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
132e0 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69  TE TABLE %Q.sqli
132f0 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65  te_sequence(name
13300 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20  ,seq)",.        
13310 20 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 0a    pDb->zDbSName.
13320 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13330 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
13340 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
13350 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
13360 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
13370 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
13380 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
13390 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
133a0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
133b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
133c0 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
133d0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
133e0 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
133f0 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
13400 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
13410 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
13420 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
13430 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
13440 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
13450 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
13460 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
13470 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
13480 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
13490 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
134a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
134b0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
134c0 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
134d0 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
134e0 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
134f0 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
13500 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c   p);.    if( pOl
13510 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  d ){.      asser
13520 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f  t( p==pOld );  /
13530 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
13540 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65  ve failed inside
13550 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f   HashInsert() */
13560 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
13570 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
13580 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
13590 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
135a0 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
135b0 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
135c0 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e  BFLAG_SchemaChan
135d0 67 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge;..#ifndef SQL
135e0 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
135f0 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
13600 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
13610 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13620 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
13630 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
13640 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
13650 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
13660 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
13670 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
13680 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
13690 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
136a0 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
136b0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
136c0 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
136d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
136e0 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
136f0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
13700 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
13710 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
13720 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
13730 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
13740 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13750 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
13760 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
13770 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
13780 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
13790 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
137a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
137b0 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
137c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
137d0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
137e0 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
137f0 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
13800 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
13810 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
13820 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
13830 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
13840 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
13850 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
13860 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
13870 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
13880 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
13890 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
138a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
138b0 20 76 69 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c   view */.  ExprL
138c0 69 73 74 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a  ist *pCNames, /*
138d0 20 4f 70 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f   Optional list o
138e0 66 20 76 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61  f view column na
138f0 6d 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  mes */.  Select 
13900 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
13910 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13920 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
13930 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
13940 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
13950 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
13960 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
13970 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
13980 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
13990 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
139a0 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
139b0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
139c0 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
139d0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
139e0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
139f0 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
13a00 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
13a10 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
13a20 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
13a30 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13a40 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
13a50 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
13a60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13a70 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
13a80 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
13a90 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
13aa0 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
13ab0 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a  _view_fail;.  }.
13ac0 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
13ad0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
13ae0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
13af0 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
13b00 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
13b10 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
13b20 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
13b30 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 63 72 65  >nErr ) goto cre
13b40 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20  ate_view_fail;. 
13b50 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
13b60 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
13b70 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
13b80 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
13b90 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13ba0 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
13bb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49  );.  sqlite3FixI
13bc0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
13bd0 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20  e, iDb, "view", 
13be0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71  pName);.  if( sq
13bf0 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26  lite3FixSelect(&
13c00 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29  sFix, pSelect) )
13c10 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65   goto create_vie
13c20 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  w_fail;..  /* Ma
13c30 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
13c40 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73   entire SELECT s
13c50 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65  tatement that de
13c60 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a  fines the view..
13c70 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66    ** This will f
13c80 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70  orce all the Exp
13c90 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73  r.token.z values
13ca0 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
13cb0 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
13cc0 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f  d rather than po
13cd0 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74  int to the input
13ce0 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20   string - which 
13cf0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20  means that.  ** 
13d00 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73  they will persis
13d10 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  t after the curr
13d20 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ent sqlite3_exec
13d30 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e  () call returns.
13d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 4e 5f 52  .  */.  if( IN_R
13d50 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
13d60 20 20 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d      p->pSelect =
13d70 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53   pSelect;.    pS
13d80 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  elect = 0;.  }el
13d90 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c 65  se{.    p->pSele
13da0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
13db0 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63  ctDup(db, pSelec
13dc0 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  t, EXPRDUP_REDUC
13dd0 45 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 43 68  E);.  }.  p->pCh
13de0 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
13df0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 43 4e  rListDup(db, pCN
13e00 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f 52 45  ames, EXPRDUP_RE
13e10 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64 62 2d  DUCE);.  if( db-
13e20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
13e30 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77  goto create_view
13e40 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  _fail;..  /* Loc
13e50 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
13e60 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
13e70 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
13e80 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
13e90 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
13ea0 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
13eb0 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
13ec0 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a 5b 30  assert( sEnd.z[0
13ed0 5d 21 3d 30 20 7c 7c 20 73 45 6e 64 2e 6e 3d 3d  ]!=0 || sEnd.n==
13ee0 30 20 29 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  0 );.  if( sEnd.
13ef0 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
13f00 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
13f10 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
13f20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
13f30 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
13f40 2d 3e 7a 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ->z);.  assert( 
13f50 6e 3e 30 20 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n>0 );.  z = pBe
13f60 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
13f70 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
13f80 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
13f90 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b  }.  sEnd.z = &z[
13fa0 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d  n-1];.  sEnd.n =
13fb0 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71   1;..  /* Use sq
13fc0 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
13fd0 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20  to add the view 
13fe0 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  to the SQLITE_MA
13ff0 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20  STER table */.  
14000 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
14010 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64  pParse, 0, &sEnd
14020 2c 20 30 2c 20 30 29 3b 0a 0a 63 72 65 61 74 65  , 0, 0);..create
14030 5f 76 69 65 77 5f 66 61 69 6c 3a 0a 20 20 73 71  _view_fail:.  sq
14040 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14050 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
14060 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
14070 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71  OBJECT ){.    sq
14080 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 6c  lite3RenameExprl
14090 69 73 74 55 6e 6d 61 70 28 70 50 61 72 73 65 2c  istUnmap(pParse,
140a0 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 7d 0a 20   pCNames);.  }. 
140b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
140c0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 4e 61 6d  Delete(db, pCNam
140d0 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  es);.  return;.}
140e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
140f0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
14100 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
14110 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
14120 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
14130 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14140 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54  BLE)./*.** The T
14150 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  able structure p
14160 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20  Table is really 
14170 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e  a VIEW.  Fill in
14180 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a   the names of.**
14190 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
141a0 74 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20  the view in the 
141b0 70 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65  pTable structure
141c0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
141d0 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72  mber.** of error
141e0 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  s.  If an error 
141f0 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e  is seen leave an
14200 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
14210 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
14220 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
14230 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
14240 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  mes(Parse *pPars
14250 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  e, Table *pTable
14260 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c  ){.  Table *pSel
14270 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65  Tab;   /* A fake
14280 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63   table from whic
14290 68 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73  h we get the res
142a0 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c  ult set */.  Sel
142b0 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f  ect *pSel;     /
142c0 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45  * Copy of the SE
142d0 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d  LECT that implem
142e0 65 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f  ents the view */
142f0 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b  .  int nErr = 0;
14300 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14310 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
14320 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ered */.  int n;
14330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14340 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73  emporarily holds
14350 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
14360 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20  ursors assigned 
14370 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
14380 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
14390 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
143a0 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f  ection for mallo
143b0 63 20 65 72 72 6f 72 73 20 2a 2f 0a 23 69 66 6e  c errors */.#ifn
143c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
143d0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
143e0 6e 74 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  nt rc;.#endif.#i
143f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14400 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
14410 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
14420 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f 2a 20  xAuth;       /* 
14430 53 61 76 65 64 20 78 41 75 74 68 20 70 6f 69 6e  Saved xAuth poin
14440 74 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ter */.#endif.. 
14450 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
14460 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
14470 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14480 41 42 4c 45 0a 20 20 64 62 2d 3e 6e 53 63 68 65  ABLE.  db->nSche
14490 6d 61 4c 6f 63 6b 2b 2b 3b 0a 20 20 72 63 20 3d  maLock++;.  rc =
144a0 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
144b0 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
144c0 70 54 61 62 6c 65 29 3b 0a 20 20 64 62 2d 3e 6e  pTable);.  db->n
144d0 53 63 68 65 6d 61 4c 6f 63 6b 2d 2d 3b 0a 20 20  SchemaLock--;.  
144e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
144f0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
14500 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14510 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  le) ) return 0;.
14520 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
14530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
14540 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65  .  /* A positive
14550 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20   nCol means the 
14560 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f  columns names fo
14570 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65 0a  r this view are.
14580 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f    ** already kno
14590 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  wn..  */.  if( p
145a0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20  Table->nCol>0 ) 
145b0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
145c0 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20  A negative nCol 
145d0 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72  is a special mar
145e0 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ker meaning that
145f0 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   we are currentl
14600 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f  y.  ** trying to
14610 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c   compute the col
14620 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77  umn names.  If w
14630 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75  e enter this rou
14640 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61  tine with.  ** a
14650 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20   negative nCol, 
14660 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20  it means two or 
14670 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20  more views form 
14680 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69  a loop, like thi
14690 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
146a0 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65   CREATE VIEW one
146b0 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
146c0 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20  M two;.  **     
146d0 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f 20  CREATE VIEW two 
146e0 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
146f0 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
14700 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72  Actually, the er
14710 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77  ror above is now
14720 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
14730 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 70   reaching this p
14740 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74  oint..  ** But t
14750 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
14760 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72  t is still impor
14770 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20  tant as it does 
14780 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20  come up.  ** in 
14790 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
147a0 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52   ** .  **     CR
147b0 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
147c0 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20  ex1(a);.  **    
147d0 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49 45   CREATE TEMP VIE
147e0 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54 20  W ex1 AS SELECT 
147f0 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a  a FROM ex1;.  **
14800 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
14810 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a  OM temp.ex1;.  *
14820 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e  /.  if( pTable->
14830 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71  nCol<0 ){.    sq
14840 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14850 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20 69  arse, "view %s i
14860 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66  s circularly def
14870 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a  ined", pTable->z
14880 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
14890 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 1;.  }.  asser
148a0 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  t( pTable->nCol>
148b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  =0 );..  /* If w
148c0 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
148d0 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64  it means we need
148e0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
148f0 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  table names..  *
14900 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
14910 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52  call to sqlite3R
14920 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
14930 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61  () will expand a
14940 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d  ny.  ** "*" elem
14950 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73 75  ents in the resu
14960 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20 76  lts set of the v
14970 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73  iew and will ass
14980 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a  ign cursors.  **
14990 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   to the elements
149a0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
149b0 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20  use.  But we do 
149c0 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20 63  not want these c
149d0 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  hanges.  ** to b
149e0 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f  e permanent.  So
149f0 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
14a00 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f   is done on a co
14a10 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  py of the SELECT
14a20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
14a30 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
14a40 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73   view..  */.  as
14a50 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53  sert( pTable->pS
14a60 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20  elect );.  pSel 
14a70 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
14a80 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  up(db, pTable->p
14a90 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
14aa0 28 20 70 53 65 6c 20 29 7b 0a 23 69 66 6e 64 65  ( pSel ){.#ifnde
14ab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
14ac0 54 45 52 54 41 42 4c 45 0a 20 20 20 20 75 38 20  TERTABLE.    u8 
14ad0 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 70 50 61  eParseMode = pPa
14ae0 72 73 65 2d 3e 65 50 61 72 73 65 4d 6f 64 65 3b  rse->eParseMode;
14af0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 65 50 61  .    pParse->ePa
14b00 72 73 65 4d 6f 64 65 20 3d 20 50 41 52 53 45 5f  rseMode = PARSE_
14b10 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3b 0a 23 65 6e  MODE_NORMAL;.#en
14b20 64 69 66 0a 20 20 20 20 6e 20 3d 20 70 50 61 72  dif.    n = pPar
14b30 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
14b40 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
14b50 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
14b60 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
14b70 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
14b80 3d 20 2d 31 3b 0a 20 20 20 20 44 69 73 61 62 6c  = -1;.    Disabl
14b90 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 23 69 66 6e  eLookaside;.#ifn
14ba0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14bb0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
14bc0 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41    xAuth = db->xA
14bd0 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  uth;.    db->xAu
14be0 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c  th = 0;.    pSel
14bf0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
14c00 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
14c10 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 53 51 4c  Parse, pSel, SQL
14c20 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a 20  ITE_AFF_NONE);. 
14c30 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78     db->xAuth = x
14c40 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Auth;.#else.    
14c50 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
14c60 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
14c70 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c  ct(pParse, pSel,
14c80 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
14c90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50  );.#endif.    pP
14ca0 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a  arse->nTab = n;.
14cb0 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e      if( pTable->
14cc0 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  pCheck ){.      
14cd0 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20 6e  /* CREATE VIEW n
14ce0 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 53 20  ame(arglist) AS 
14cf0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ....      ** The
14d00 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   names of the co
14d10 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
14d20 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  le are taken fro
14d30 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 6c 69  m.      ** argli
14d40 73 74 20 77 68 69 63 68 20 69 73 20 73 74 6f 72  st which is stor
14d50 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e 70 43  ed in pTable->pC
14d60 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 65 63  heck.  The pChec
14d70 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 2a 2a  k field.      **
14d80 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 73 20   normally holds 
14d90 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
14da0 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 72 79  s on an ordinary
14db0 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f 72 0a   table, but for.
14dc0 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 57 20        ** a VIEW 
14dd0 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c 69 73  it holds the lis
14de0 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  t of column name
14df0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
14e00 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
14e10 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
14e20 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  rse, pTable->pCh
14e30 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20  eck, .          
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e         &pTable->
14e60 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61  nCol, &pTable->a
14e70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
14e80 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14e90 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
14ea0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 0a 20  Parse->nErr==0. 
14eb0 20 20 20 20 20 20 26 26 20 70 54 61 62 6c 65 2d        && pTable-
14ec0 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 45 4c  >nCol==pSel->pEL
14ed0 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ist->nExpr.     
14ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14ef0 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75  te3SelectAddColu
14f00 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
14f10 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  on(pParse, pTabl
14f20 65 2c 20 70 53 65 6c 2c 0a 20 20 20 20 20 20 20  e, pSel,.       
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
14f60 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 20 20  FF_NONE);.      
14f70 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
14f80 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
14f90 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 20   /* CREATE VIEW 
14fa0 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 74 68  name AS...  with
14fb0 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 20  out an argument 
14fc0 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 63 74  list.  Construct
14fd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  .      ** the co
14fe0 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
14ff0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
15000 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
15010 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 20 20  s the view..    
15020 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
15030 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
15040 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
15050 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 54 61 62 6c  le->nCol = pTabl
15060 65 2d 3e 6e 4e 56 43 6f 6c 20 3d 20 70 53 65 6c  e->nNVCol = pSel
15070 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
15080 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
15090 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
150a0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
150b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
150c0 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
150d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
150e0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
150f0 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61  xHeld(db, 0, pTa
15100 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  ble->pSchema) );
15110 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15120 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
15130 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
15140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15150 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
15160 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20  b, pSelTab);.   
15170 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
15180 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a  lete(db, pSel);.
15190 20 20 20 20 45 6e 61 62 6c 65 4c 6f 6f 6b 61 73      EnableLookas
151a0 69 64 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ide;.#ifndef SQL
151b0 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
151c0 42 4c 45 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  BLE.    pParse->
151d0 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 65 50 61  eParseMode = ePa
151e0 72 73 65 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a  rseMode;.#endif.
151f0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
15200 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61  Err++;.  }.  pTa
15210 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  ble->pSchema->sc
15220 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f  hemaFlags |= DB_
15230 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
15240 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
15250 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
15260 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e  te3DeleteColumnN
15270 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29  ames(db, pTable)
15280 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43  ;.    pTable->aC
15290 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62  ol = 0;.    pTab
152a0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
152b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
152c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
152d0 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
152e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
152f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15300 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
15310 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15320 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
15330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15340 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
15350 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
15360 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
15370 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
15380 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
15390 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
153a0 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
153b0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
153c0 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
153d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
153e0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
153f0 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b  d(db, idx, 0) );
15400 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
15410 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
15420 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
15430 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
15440 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
15450 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
15460 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
15470 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
15480 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
15490 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
154a0 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
154b0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
154c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
154d0 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75  qlite3DeleteColu
154e0 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
154f0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
15500 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
15510 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
15520 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
15530 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
15540 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
15550 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
15560 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
15570 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
15580 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15590 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
155a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
155b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
155c0 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
155d0 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
155e0 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
155f0 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
15600 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
15610 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
15620 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
15630 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
15640 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
15650 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
15660 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
15670 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
15680 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
15690 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
156a0 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
156b0 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
156c0 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
156d0 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
156e0 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
156f0 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
15700 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
15710 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
15720 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
15730 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
15740 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
15750 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
15760 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
15770 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
15780 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
15790 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
157a0 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
157b0 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
157c0 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
157d0 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
157e0 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
157f0 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
15800 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
15810 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
15820 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
15830 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
15840 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
15850 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
15860 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
15870 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
15880 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
15890 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
158a0 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
158b0 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
158c0 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
158d0 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
158e0 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
158f0 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
15900 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
15910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15920 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
15930 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
15940 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20  geMoved(sqlite3 
15950 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
15960 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
15970 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
15980 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
15990 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ash;.  Db *pDb;.
159a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
159b0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
159c0 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
159d0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
159e0 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20  b[iDb];.  pHash 
159f0 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
15a00 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
15a10 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
15a20 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
15a30 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
15a40 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
15a50 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
15a60 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
15a70 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
15a80 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
15a90 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
15aa0 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
15ab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
15ac0 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
15ad0 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
15ae0 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
15af0 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
15b00 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
15b10 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
15b20 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
15b30 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
15b40 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
15b50 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
15b60 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
15b70 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
15b80 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
15b90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
15ba0 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
15bb0 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
15bc0 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
15bd0 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
15be0 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
15bf0 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
15c00 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
15c10 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
15c20 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
15c30 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
15c40 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
15c50 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
15c60 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
15c70 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
15c80 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
15c90 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
15ca0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
15cb0 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
15cc0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
15cd0 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
15ce0 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
15cf0 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
15d00 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
15d10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
15d20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
15d30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
15d40 73 65 29 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  se);.  if( iTabl
15d50 65 3c 32 20 29 20 73 71 6c 69 74 65 33 45 72 72  e<2 ) sqlite3Err
15d60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
15d70 6f 72 72 75 70 74 20 73 63 68 65 6d 61 22 29 3b  orrupt schema");
15d80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15d90 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72  dOp3(v, OP_Destr
15da0 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  oy, iTable, r1, 
15db0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  iDb);.  sqlite3M
15dc0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
15dd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15de0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15df0 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    /* OP_Destroy 
15e00 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74  stores an in int
15e10 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73  eger r1. If this
15e20 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73   integer.  ** is
15e30 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
15e40 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
15e50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
15e60 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20  table moved to. 
15e70 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61   ** location iTa
15e80 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ble. The followi
15e90 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73  ng code modifies
15ea0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
15eb0 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a  er table to.  **
15ec0 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20   reflect this.. 
15ed0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e   **.  ** The "#N
15ee0 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  NN" in the SQL i
15ef0 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
15f00 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
15f10 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
15f20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74   ** is in regist
15f30 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61  er NNN.  See gra
15f40 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63  mmar rules assoc
15f50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54  iated with the T
15f60 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20  K_REGISTER.  ** 
15f70 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69  token for additi
15f80 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
15f90 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15fa0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
15fb0 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54  se, .     "UPDAT
15fc0 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74  E %Q.%s SET root
15fd0 70 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25  page=%d WHERE #%
15fe0 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23  d AND rootpage=#
15ff0 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65  %d",.     pParse
16000 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
16010 44 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f  DbSName, MASTER_
16020 4e 41 4d 45 2c 20 69 54 61 62 6c 65 2c 20 72 31  NAME, iTable, r1
16030 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
16040 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16050 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
16070 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
16080 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
16090 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
160a0 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
160b0 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
160c0 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
160d0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
160e0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
160f0 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
16100 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
16110 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
16120 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
16130 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
16140 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
16150 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
16160 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
16170 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
16180 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
16190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
161a0 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
161b0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
161c0 70 54 61 62 29 7b 0a 20 20 2f 2a 20 49 66 20 74  pTab){.  /* If t
161d0 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
161e0 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
161f0 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
16200 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16210 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
16220 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
16230 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
16240 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
16250 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
16260 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
16270 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
16280 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
16290 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
162a0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
162b0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
162c0 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
162d0 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
162e0 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
162f0 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
16300 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
16310 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
16320 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
16330 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
16340 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
16350 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
16360 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
16370 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
16380 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
16390 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
163a0 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
163b0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
163c0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
163d0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
163e0 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
163f0 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
16400 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
16410 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
16420 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
16430 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
16440 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
16450 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
16460 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
16470 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
16480 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
16490 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
164a0 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
164b0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
164c0 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
164d0 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
164e0 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
164f0 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
16500 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
16510 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
16520 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
16530 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
16540 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
16550 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
16560 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
16570 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
16580 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
16590 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
165a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
165b0 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
165c0 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
165d0 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
165e0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
165f0 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
16600 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16610 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
16620 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
16630 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
16640 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
16650 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
16660 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
16670 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
16680 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
16690 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
166a0 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
166b0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
166c0 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
166d0 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
166e0 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
166f0 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
16700 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
16710 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
16720 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e  the sqlite_statN
16730 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69   tables (for N i
16740 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66  n (1,2,3)).** af
16750 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58  ter a DROP INDEX
16760 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63   or DROP TABLE c
16770 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
16780 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  c void sqlite3Cl
16790 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20  earStatTables(. 
167a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
167b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
167c0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
167d0 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
167e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
167f0 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  e database numbe
16800 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
16810 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
16820 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20   "idx" or "tbl" 
16830 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16840 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e  *zName      /* N
16850 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20  ame of index or 
16860 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  table */.){.  in
16870 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  t i;.  const cha
16880 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61  r *zDbName = pPa
16890 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
168a0 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 66 6f  ].zDbSName;.  fo
168b0 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
168c0 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
168d0 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
168e0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
168f0 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
16900 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
16910 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16920 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
16930 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
16940 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
16950 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
16960 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
16970 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
16980 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
16990 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
169a0 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
169b0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
169c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
169d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
169e0 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
169f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16a00 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
16a10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
16a20 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
16a30 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
16a40 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
16a50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
16a60 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
16a70 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
16a80 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
16a90 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
16aa0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16ab0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
16ac0 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
16ad0 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
16ae0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
16af0 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
16b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
16b10 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
16b20 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
16b30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16b40 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
16b50 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
16b60 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
16b70 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
16b80 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
16b90 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
16ba0 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
16bb0 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
16bc0 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
16bd0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
16be0 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
16bf0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
16c00 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
16c10 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
16c20 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
16c30 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
16c40 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
16c50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16c60 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
16c70 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
16c80 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
16c90 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
16ca0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
16cb0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
16cc0 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
16cd0 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
16ce0 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
16cf0 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
16d00 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
16d10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
16d20 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
16d30 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
16d40 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
16d50 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
16d60 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
16d70 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
16d80 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
16d90 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
16da0 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
16db0 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
16dc0 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
16dd0 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
16de0 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
16df0 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
16e00 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
16e10 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
16e20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
16e30 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
16e40 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
16e50 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
16e60 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
16e70 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
16e80 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
16e90 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
16ea0 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
16eb0 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
16ec0 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62  ,.      pDb->zDb
16ed0 53 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  SName, pTab->zNa
16ee0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65  me.    );.  }.#e
16ef0 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
16f00 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  all SQLITE_MASTE
16f10 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65  R table and inde
16f20 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72  x entries that r
16f30 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  efer to the.  **
16f40 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
16f50 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
16f60 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
16f70 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
16f80 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72  tes.  ** every r
16f90 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
16fa0 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
16fb0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
16fc0 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a  e one being.  **
16fd0 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65   dropped. Trigge
16fe0 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  rs are handled s
16ff0 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73  eparately becaus
17000 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20  e a trigger can 
17010 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  be.  ** created 
17020 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
17030 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
17040 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
17050 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61  nother.  ** data
17060 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  base..  */.  sql
17070 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
17080 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
17090 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
170a0 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  s WHERE tbl_name
170b0 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74  =%Q and type!='t
170c0 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20  rigger'",.      
170d0 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 4d  pDb->zDbSName, M
170e0 41 53 54 45 52 5f 4e 41 4d 45 2c 20 70 54 61 62  ASTER_NAME, pTab
170f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
17100 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
17110 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
17120 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
17130 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
17140 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
17150 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
17160 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
17170 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
17180 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
17190 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
171a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
171b0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
171c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
171d0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
171e0 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
171f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
17200 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41  .    sqlite3MayA
17210 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20  bort(pParse);.  
17220 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
17230 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
17240 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
17250 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
17260 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e  );.  sqlite3Chan
17270 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
17280 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56   iDb);.  sqliteV
17290 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20  iewResetAll(db, 
172a0 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iDb);.}../*.** T
172b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
172c0 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
172d0 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
172e0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
172f0 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
17300 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
17310 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
17320 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17330 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
17340 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
17350 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
17360 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
17370 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
17380 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
17390 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
173a0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
173b0 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  ;..  if( db->mal
173c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
173d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
173e0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
173f0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
17400 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
17410 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
17420 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
17430 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
17440 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  se) ) goto exit_
17450 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66  drop_table;.  if
17460 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75  ( noErr ) db->su
17470 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 61  ppressErr++;.  a
17480 73 73 65 72 74 28 20 69 73 56 69 65 77 3d 3d 30  ssert( isView==0
17490 20 7c 7c 20 69 73 56 69 65 77 3d 3d 4c 4f 43 41   || isView==LOCA
174a0 54 45 5f 56 49 45 57 20 29 3b 0a 20 20 70 54 61  TE_VIEW );.  pTa
174b0 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
174c0 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
174d0 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d  e, isView, &pNam
174e0 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20  e->a[0]);.  if( 
174f0 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70  noErr ) db->supp
17500 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66  ressErr--;..  if
17510 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
17520 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c   if( noErr ) sql
17530 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61  ite3CodeVerifyNa
17540 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  medSchema(pParse
17550 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
17560 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f  atabase);.    go
17570 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
17580 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  le;.  }.  iDb = 
17590 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
175a0 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
175b0 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72  Schema);.  asser
175c0 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
175d0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f  <db->nDb );..  /
175e0 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76  * If pTab is a v
175f0 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61  irtual table, ca
17600 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  ll ViewGetColumn
17610 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72  Names() to ensur
17620 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69  e.  ** it is ini
17630 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
17640 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
17650 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56  Tab) && sqlite3V
17660 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
17670 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
17680 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
17690 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
176a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
176b0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
176c0 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
176d0 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ode;.    const c
176e0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
176f0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
17700 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17710 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
17720 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20  ].zDbSName;.    
17730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
17740 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
17750 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
17760 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
17770 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
17780 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
17790 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
177a0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
177b0 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
177c0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
177d0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
177e0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
177f0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
17800 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
17810 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
17820 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
17830 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
17840 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17850 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
17860 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
17870 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
17880 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
17890 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
178a0 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
178b0 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
178c0 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
178d0 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
178e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
178f0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
17900 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
17910 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
17920 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
17930 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17940 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
17950 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
17960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17970 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17980 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17990 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
179a0 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
179b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
179c0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
179d0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
179e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
179f0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
17a00 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
17a10 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
17a20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17a30 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
17a40 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
17a50 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
17a60 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
17a70 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
17a80 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
17a90 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
17aa0 2b 37 2c 20 22 73 74 61 74 22 2c 20 34 29 21 3d  +7, "stat", 4)!=
17ab0 30 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  0.    && sqlite3
17ac0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
17ad0 4e 61 6d 65 2b 37 2c 20 22 70 61 72 61 6d 65 74  Name+7, "paramet
17ae0 65 72 73 22 2c 20 31 30 29 21 3d 30 20 29 7b 0a  ers", 10)!=0 ){.
17af0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17b00 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
17b10 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
17b20 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
17b30 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
17b40 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
17b50 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
17b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
17b70 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
17b80 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
17b90 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
17ba0 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
17bb0 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
17bc0 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
17bd0 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
17be0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
17bf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17c00 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17c10 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
17c20 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
17c30 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
17c40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17c50 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
17c60 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
17c70 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
17c80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
17c90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
17ca0 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
17cb0 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
17cc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
17cd0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
17ce0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
17cf0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
17d00 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
17d10 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
17d20 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
17d30 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
17d40 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
17d50 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
17d60 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
17d70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
17d80 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
17d90 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
17da0 20 20 69 66 28 20 21 69 73 56 69 65 77 20 29 7b    if( !isView ){
17db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
17dc0 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
17dd0 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22  arse, iDb, "tbl"
17de0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
17df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44        sqlite3FkD
17e00 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
17e10 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
17e20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17e30 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50  CodeDropTable(pP
17e40 61 72 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c  arse, pTab, iDb,
17e50 20 69 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65   isView);.  }..e
17e60 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
17e70 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
17e80 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
17e90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
17ea0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
17eb0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
17ec0 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
17ed0 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
17ee0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
17ef0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
17f00 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
17f10 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
17f20 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
17f30 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
17f40 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
17f50 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
17f60 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
17f70 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
17f80 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
17f90 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
17fa0 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
17fb0 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
17fc0 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22   to (a.k.a the "
17fd0 70 61 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20  parent" table). 
17fe0 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73   pToCol is a lis
17ff0 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69  t.** of tables i
18000 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f  n the parent pTo
18010 20 74 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63   table.  flags c
18020 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69  ontains all.** i
18030 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
18040 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65   the conflict re
18050 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
18060 68 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  hms specified.**
18070 20 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54   in the ON DELET
18080 45 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64  E, ON UPDATE and
18090 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73   ON INSERT claus
180a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65  es..**.** An FKe
180b0 79 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  y structure is c
180c0 72 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64  reated and added
180d0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
180e0 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72  rrently.** under
180f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
18100 20 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   the pParse->pNe
18110 77 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a  wTable field..**
18120 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20  .** The foreign 
18130 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49  key is set for I
18140 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73  MMEDIATE process
18150 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65  ing.  A subseque
18160 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71  nt call.** to sq
18170 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
18180 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61  nKey() might cha
18190 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45  nge this to DEFE
181a0 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  RRED..*/.void sq
181b0 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
181c0 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a  gnKey(.  Parse *
181d0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
181e0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
181f0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
18200 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f  pFromCol,  /* Co
18210 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61  lumns in this ta
18220 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ble that point t
18230 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  o other table */
18240 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20  .  Token *pTo,  
18250 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18260 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  of the other tab
18270 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
18280 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20   *pToCol,    /* 
18290 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  Columns in the o
182a0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
182b0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
182c0 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74       /* Conflict
182d0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
182e0 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rithms. */.){.  
182f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
18300 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65  arse->db;.#ifnde
18310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
18320 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
18330 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46   *pFKey = 0;.  F
18340 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20  Key *pNextTo;.  
18350 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73  Table *p = pPars
18360 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
18370 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
18380 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a   i;.  int nCol;.
18390 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73    char *z;..  as
183a0 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a  sert( pTo!=0 );.
183b0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e    if( p==0 || IN
183c0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20  _DECLARE_VTAB ) 
183d0 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69  goto fk_end;.  i
183e0 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29  f( pFromCol==0 )
183f0 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d  {.    int iCol =
18400 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20   p->nCol-1;.    
18410 69 66 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30  if( NEVER(iCol<0
18420 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  ) ) goto fk_end;
18430 0a 20 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  .    if( pToCol 
18440 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72  && pToCol->nExpr
18450 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=1 ){.      sql
18460 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18470 72 73 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65  rse, "foreign ke
18480 79 20 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20  y on %s".       
18490 20 20 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72    " should refer
184a0 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f  ence only one co
184b0 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54  lumn of table %T
184c0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61  ",.         p->a
184d0 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c  Col[iCol].zName,
184e0 20 70 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74   pTo);.      got
184f0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  o fk_end;.    }.
18500 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20      nCol = 1;.  
18510 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c  }else if( pToCol
18520 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70   && pToCol->nExp
18530 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78  r!=pFromCol->nEx
18540 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
18550 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18560 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
18570 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
18580 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73  foreign key does
18590 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e   not match the n
185a0 75 6d 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20  umber of ".     
185b0 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74     "columns in t
185c0 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61  he referenced ta
185d0 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ble");.    goto 
185e0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  fk_end;.  }else{
185f0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f  .    nCol = pFro
18600 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  mCol->nExpr;.  }
18610 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
18620 66 28 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f  f(*pFKey) + (nCo
18630 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65  l-1)*sizeof(pFKe
18640 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54  y->aCol[0]) + pT
18650 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20  o->n + 1;.  if( 
18660 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
18670 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d  r(i=0; i<pToCol-
18680 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
18690 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c      nByte += sql
186a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
186b0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
186c0 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   + 1;.    }.  }.
186d0 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65    pFKey = sqlite
186e0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
186f0 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  , nByte );.  if(
18700 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20   pFKey==0 ){.   
18710 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
18720 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d  }.  pFKey->pFrom
18730 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70   = p;.  pFKey->p
18740 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46  NextFrom = p->pF
18750 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  Key;.  z = (char
18760 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e  *)&pFKey->aCol[n
18770 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a  Col];.  pFKey->z
18780 54 6f 20 3d 20 7a 3b 0a 20 20 69 66 28 20 49 4e  To = z;.  if( IN
18790 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
187a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
187b0 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
187c0 73 65 2c 20 28 76 6f 69 64 2a 29 7a 2c 20 70 54  se, (void*)z, pT
187d0 6f 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  o);.  }.  memcpy
187e0 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d  (z, pTo->z, pTo-
187f0 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d  >n);.  z[pTo->n]
18800 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
18810 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b  equote(z);.  z +
18820 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
18830 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Key->nCol = nCol
18840 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
18850 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79  ==0 ){.    pFKey
18860 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20  ->aCol[0].iFrom 
18870 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d  = p->nCol-1;.  }
18880 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
18890 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
188a0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
188b0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
188c0 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
188d0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
188e0 33 53 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c  3StrICmp(p->aCol
188f0 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d  [j].zName, pFrom
18900 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
18910 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
18920 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e   pFKey->aCol[i].
18930 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20  iFrom = j;.     
18940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18950 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18960 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43      if( j>=p->nC
18970 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ol ){.        sq
18980 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18990 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
189a0 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e   "unknown column
189b0 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69   \"%s\" in forei
189c0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
189d0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  n", .          p
189e0 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e  FromCol->a[i].zN
189f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
18a00 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20  to fk_end;.     
18a10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 49 4e 5f   }.      if( IN_
18a20 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
18a30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a40 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
18a50 28 70 50 61 72 73 65 2c 20 26 70 46 4b 65 79 2d  (pParse, &pFKey-
18a60 3e 61 43 6f 6c 5b 69 5d 2c 20 70 46 72 6f 6d 43  >aCol[i], pFromC
18a70 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
18a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18a90 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
18aa0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
18ab0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
18ac0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
18ad0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
18ae0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
18af0 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
18b00 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
18b10 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e        if( IN_REN
18b20 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
18b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
18b40 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
18b50 61 72 73 65 2c 20 7a 2c 20 70 54 6f 43 6f 6c 2d  arse, z, pToCol-
18b60 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
18b70 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63      }.      memc
18b80 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
18b90 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
18ba0 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
18bb0 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
18bc0 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
18bd0 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
18be0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
18bf0 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
18c00 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
18c10 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
18c20 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
18c30 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
18c40 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
18c50 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
18c60 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
18c70 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
18c80 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
18c90 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
18ca0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
18cb0 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
18cc0 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
18cd0 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
18ce0 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
18cf0 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
18d00 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
18d10 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
18d20 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
18d30 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
18d40 64 62 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  db);.    goto fk
18d50 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
18d60 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
18d70 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
18d80 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
18d90 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
18da0 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
18db0 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
18dc0 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
18dd0 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
18de0 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
18df0 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
18e00 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
18e10 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
18e20 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
18e30 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
18e40 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
18e50 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
18e60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18e70 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
18e80 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
18e90 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
18ea0 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
18eb0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
18ec0 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
18ed0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18ee0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
18ef0 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
18f00 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
18f10 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
18f20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
18f30 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
18f40 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
18f50 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
18f60 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
18f70 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
18f80 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
18f90 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
18fa0 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
18fb0 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
18fc0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
18fd0 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
18fe0 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
18ff0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
19000 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
19010 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
19020 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
19030 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
19040 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
19050 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
19060 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
19070 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
19080 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
19090 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
190a0 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
190b0 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
190c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
190d0 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
190e0 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
190f0 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
19100 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
19110 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
19120 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
19130 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
19140 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19150 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
19160 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
19170 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
19180 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
19190 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
191a0 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
191b0 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
191c0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
191d0 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
191e0 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
191f0 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
19200 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
19210 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
19220 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
19230 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
19240 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
19250 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
19260 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
19270 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
19280 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
19290 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
192a0 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
192b0 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
192c0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
192d0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
192e0 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
192f0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
19300 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
19310 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
19320 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
19330 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
19340 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
19350 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
19360 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
19370 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
19380 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
19390 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
193a0 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
193b0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
193c0 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
193d0 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
193e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
193f0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
19400 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
19410 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
19420 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
19430 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
19440 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
19450 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
19460 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
19470 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20  t iSorter;      
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19490 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79  Cursor opened by
194a0 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20   OpenSorter (if 
194b0 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  in use) */.  int
194c0 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
194d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
194e0 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
194f0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
19500 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
19510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
19520 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
19530 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
19540 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  on */.  int tnum
19550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19560 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
19570 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
19580 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61    int iPartIdxLa
19590 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
195a0 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73   /* Jump to this
195b0 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61   label to skip a
195c0 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a   row */.  Vdbe *
195d0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
195e0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
195f0 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
19600 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
19610 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
19620 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
19630 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
19640 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
19650 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
19680 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69  ding assembled i
19690 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
196a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
196b0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
196c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
196d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
196e0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
196f0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
19700 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
19710 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
19720 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
19730 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
19740 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
19750 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
19760 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
19770 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
19780 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
19790 4e 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65  Name ) ){.    re
197a0 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
197b0 0a 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61  ..  /* Require a
197c0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
197d0 68 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66  he table to perf
197e0 6f 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69  orm this operati
197f0 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54  on */.  sqlite3T
19800 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c  ableLock(pParse,
19810 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d   iDb, pTab->tnum
19820 2c 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 1, pTab->zName
19830 29 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  );..  v = sqlite
19840 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19850 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
19860 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d  eturn;.  if( mem
19870 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
19880 20 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f     tnum = memRoo
19890 74 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tPage;.  }else{.
198a0 20 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65      tnum = pInde
198b0 78 2d 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70  x->tnum;.  }.  p
198c0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
198d0 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
198e0 73 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 61  se, pIndex);.  a
198f0 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c  ssert( pKey!=0 |
19900 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
19910 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
19920 72 72 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  rr );..  /* Open
19930 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
19940 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
19950 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
19960 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
19970 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
19980 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19990 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
199a0 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78  orter, 0, pIndex
199b0 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72  ->nKeyCol, (char
199c0 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *).             
199d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
199e0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20  yInfoRef(pKey), 
199f0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
19a00 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c  /* Open the tabl
19a10 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  e. Loop through 
19a20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
19a30 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67  table, inserting
19a40 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f   index.  ** reco
19a50 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  rds into the sor
19a60 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ter. */.  sqlite
19a70 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
19a80 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54  e, iTab, iDb, pT
19a90 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
19aa0 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ;.  addr1 = sqli
19ab0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19ac0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
19ad0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
19ae0 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f  ge(v);.  regReco
19af0 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
19b00 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19b10 20 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72    sqlite3MultiWr
19b20 69 74 65 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ite(pParse);..  
19b30 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
19b40 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70  ndexKey(pParse,p
19b50 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65  Index,iTab,regRe
19b60 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78  cord,0,&iPartIdx
19b70 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71  Label,0,0);.  sq
19b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19b90 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65  v, OP_SorterInse
19ba0 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  rt, iSorter, reg
19bb0 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
19bc0 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78  e3ResolvePartIdx
19bd0 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50  Label(pParse, iP
19be0 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
19bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19c00 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
19c10 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64  ab, addr1+1); Vd
19c20 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19c30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
19c40 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
19c50 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
19c60 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
19c70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
19c80 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
19c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
19ca0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
19cb0 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
19cc0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
19ce0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
19cf0 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
19d00 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19d10 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
19d20 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
19d30 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
19d40 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
19d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d60 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
19d70 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
19d80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19d90 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
19da0 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 7b  Index(pIndex) ){
19db0 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
19dc0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
19dd0 20 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d   1);.    addr2 =
19de0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
19df0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
19e00 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
19e10 79 41 62 6f 72 74 61 62 6c 65 28 76 2c 20 4f 45  yAbortable(v, OE
19e20 5f 41 62 6f 72 74 29 3b 0a 20 20 20 20 73 71 6c  _Abort);.    sql
19e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
19e40 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f  t(v, OP_SorterCo
19e50 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20  mpare, iSorter, 
19e60 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20  j2, regRecord,. 
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
19e90 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
19ea0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
19eb0 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
19ec0 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
19ed0 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
19ee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19ef0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 32 29  eJumpHere(v, j2)
19f00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19f10 2a 20 4d 6f 73 74 20 43 52 45 41 54 45 20 49 4e  * Most CREATE IN
19f20 44 45 58 20 61 6e 64 20 52 45 49 4e 44 45 58 20  DEX and REINDEX 
19f30 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
19f40 61 72 65 20 6e 6f 74 20 55 4e 49 51 55 45 20 63  are not UNIQUE c
19f50 61 6e 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 62  an not.    ** ab
19f60 6f 72 74 2e 20 54 68 65 20 65 78 63 65 70 74 69  ort. The excepti
19f70 6f 6e 20 69 73 20 69 66 20 6f 6e 65 20 6f 66 20  on is if one of 
19f80 74 68 65 20 69 6e 64 65 78 65 64 20 65 78 70 72  the indexed expr
19f90 65 73 73 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 73  essions contains
19fa0 20 61 0a 20 20 20 20 2a 2a 20 75 73 65 72 20 66   a.    ** user f
19fb0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74 68 72  unction that thr
19fc0 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ows an exception
19fd0 20 77 68 65 6e 20 69 74 20 69 73 20 65 76 61 6c   when it is eval
19fe0 75 61 74 65 64 2e 20 42 75 74 20 74 68 65 0a 20  uated. But the. 
19ff0 20 20 20 2a 2a 20 6f 76 65 72 68 65 61 64 20 6f     ** overhead o
1a000 66 20 61 64 64 69 6e 67 20 61 20 73 74 61 74 65  f adding a state
1a010 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  ment journal to 
1a020 61 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  a CREATE INDEX s
1a030 74 61 74 65 6d 65 6e 74 20 69 73 0a 20 20 20 20  tatement is.    
1a040 2a 2a 20 76 65 72 79 20 73 6d 61 6c 6c 20 28 73  ** very small (s
1a050 69 6e 63 65 20 6d 6f 73 74 20 6f 66 20 74 68 65  ince most of the
1a060 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 64   pages written d
1a070 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 63 6f  o not contain co
1a080 6e 74 65 6e 74 20 74 68 61 74 0a 20 20 20 20 2a  ntent that.    *
1a090 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  * needs to be re
1a0a0 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 73 74  stored if the st
1a0b0 61 74 65 6d 65 6e 74 20 61 62 6f 72 74 73 29 2c  atement aborts),
1a0c0 20 73 6f 20 77 65 20 63 61 6c 6c 20 0a 20 20 20   so we call .   
1a0d0 20 2a 2a 20 73 71 6c 69 74 65 33 4d 61 79 41 62   ** sqlite3MayAb
1a0e0 6f 72 74 28 29 20 66 6f 72 20 61 6c 6c 20 43 52  ort() for all CR
1a0f0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1a100 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 73  ments.  */.    s
1a110 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
1a120 50 61 72 73 65 29 3b 0a 20 20 20 20 61 64 64 72  Parse);.    addr
1a130 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
1a140 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
1a150 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1a160 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
1a170 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
1a180 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
1a190 78 29 3b 0a 20 20 69 66 28 20 21 70 49 6e 64 65  x);.  if( !pInde
1a1a0 78 2d 3e 62 41 73 63 4b 65 79 42 75 67 20 29 7b  x->bAscKeyBug ){
1a1b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 4f 50 5f  .    /* This OP_
1a1c0 53 65 65 6b 45 6e 64 20 6f 70 63 6f 64 65 20 6d  SeekEnd opcode m
1a1d0 61 6b 65 73 20 69 6e 64 65 78 20 69 6e 73 65 72  akes index inser
1a1e0 74 20 66 6f 72 20 61 20 52 45 49 4e 44 45 58 20  t for a REINDEX 
1a1f0 67 6f 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20 66  go much.    ** f
1a200 61 73 74 65 72 20 62 79 20 61 76 6f 69 64 69 6e  aster by avoidin
1a210 67 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 65  g unnecessary se
1a220 65 6b 73 2e 20 20 42 75 74 20 74 68 65 20 6f 70  eks.  But the op
1a230 74 69 6d 69 7a 61 74 69 6f 6e 20 64 6f 65 73 0a  timization does.
1a240 20 20 20 20 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20      ** not work 
1a250 66 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  for UNIQUE const
1a260 72 61 69 6e 74 20 69 6e 64 65 78 65 73 20 6f 6e  raint indexes on
1a270 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1a280 61 62 6c 65 73 0a 20 20 20 20 2a 2a 20 77 69 74  ables.    ** wit
1a290 68 20 44 45 53 43 20 70 72 69 6d 61 72 79 20 6b  h DESC primary k
1a2a0 65 79 73 2c 20 73 69 6e 63 65 20 74 68 6f 73 65  eys, since those
1a2b0 20 69 6e 64 65 78 65 73 20 68 61 76 65 20 74 68   indexes have th
1a2c0 65 72 65 20 6b 65 79 73 20 69 6e 0a 20 20 20 20  ere keys in.    
1a2d0 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f  ** a different o
1a2e0 72 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6d 61  rder from the ma
1a2f0 69 6e 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  in table..    **
1a300 20 53 65 65 20 74 69 63 6b 65 74 3a 20 68 74 74   See ticket: htt
1a310 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  ps://www.sqlite.
1a320 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 62 62 61  org/src/info/bba
1a330 37 62 36 39 66 39 38 34 39 62 35 62 66 0a 20 20  7b69f9849b5bf.  
1a340 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1a350 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1a360 5f 53 65 65 6b 45 6e 64 2c 20 69 49 64 78 29 3b  _SeekEnd, iIdx);
1a370 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1a380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1a390 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
1a3a0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
1a3b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1a3c0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
1a3d0 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
1a3e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a3f0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
1a400 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
1a410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a420 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
1a430 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
1a440 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a450 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1a460 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1a470 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
1a480 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
1a490 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
1a4a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a4b0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
1a4c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1a4d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
1a4e0 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
1a4f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
1a500 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
1a510 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
1a520 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
1a530 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
1a540 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
1a550 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
1a560 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
1a570 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
1a580 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
1a590 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
1a5a0 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
1a5b0 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
1a5c0 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
1a5d0 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
1a5e0 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
1a5f0 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
1a600 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
1a610 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1a620 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1a630 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
1a640 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
1a650 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1a660 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
1a670 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
1a680 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1a690 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a6a0 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
1a6b0 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
1a6c0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
1a6d0 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
1a6e0 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
1a6f0 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
1a700 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
1a710 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
1a720 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
1a730 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
1a740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1a750 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
1a760 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
1a770 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
1a780 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
1a790 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
1a7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1a7b0 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
1a7c0 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
1a7d0 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
1a7e0 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
1a7f0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
1a800 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1a810 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
1a820 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
1a830 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
1a840 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
1a870 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
1a880 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
1a890 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1a8a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
1a8b0 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
1a8c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
1a8d0 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
1a8e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1a8f0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
1a900 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
1a910 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
1a920 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
1a930 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
1a940 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
1a950 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
1a960 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
1a970 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
1a980 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
1a990 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
1a9a0 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
1a9b0 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
1a9c0 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
1a9d0 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
1a9e0 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
1a9f0 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
1aa00 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
1aa10 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
1aa20 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
1aa30 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
1aa40 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
1aa50 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
1aa60 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
1aa70 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
1aa80 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
1aa90 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
1aaa0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
1aab0 49 66 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  If expression li
1aac0 73 74 20 70 4c 69 73 74 20 63 6f 6e 74 61 69 6e  st pList contain
1aad0 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
1aae0 74 68 61 74 20 77 61 73 20 70 61 72 73 65 64 20  that was parsed 
1aaf0 77 69 74 68 0a 2a 2a 20 61 6e 20 65 78 70 6c 69  with.** an expli
1ab00 63 69 74 20 22 4e 55 4c 4c 53 20 46 49 52 53 54  cit "NULLS FIRST
1ab10 22 20 6f 72 20 22 4e 55 4c 4c 53 20 4c 41 53 54  " or "NULLS LAST
1ab20 22 20 63 6c 61 75 73 65 2c 20 6c 65 61 76 65 20  " clause, leave 
1ab30 61 6e 20 65 72 72 6f 72 20 69 6e 0a 2a 2a 20 70  an error in.** p
1ab40 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
1ab50 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 4f 74 68 65 72   non-zero. Other
1ab60 77 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72  wise, return zer
1ab70 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
1ab80 33 48 61 73 45 78 70 6c 69 63 69 74 4e 75 6c 6c  3HasExplicitNull
1ab90 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1aba0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1abb0 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  ){.  if( pList )
1abc0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1abd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1abe0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1abf0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1ac00 3e 61 5b 69 5d 2e 62 4e 75 6c 6c 73 20 29 7b 0a  >a[i].bNulls ){.
1ac10 20 20 20 20 20 20 20 20 75 38 20 73 66 20 3d 20          u8 sf = 
1ac20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 73 6f 72 74  pList->a[i].sort
1ac30 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 73  Flags;.        s
1ac40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ac50 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72  Parse, "unsuppor
1ac60 74 65 64 20 75 73 65 20 6f 66 20 4e 55 4c 4c 53  ted use of NULLS
1ac70 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20   %s", .         
1ac80 20 20 20 28 73 66 3d 3d 30 20 7c 7c 20 73 66 3d     (sf==0 || sf=
1ac90 3d 33 29 20 3f 20 22 46 49 52 53 54 22 20 3a 20  =3) ? "FIRST" : 
1aca0 22 4c 41 53 54 22 0a 20 20 20 20 20 20 20 20 29  "LAST".        )
1acb0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1acc0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1acd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1ace0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1acf0 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
1ad00 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
1ad10 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
1ad20 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
1ad30 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
1ad40 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
1ad50 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
1ad60 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
1ad70 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
1ad80 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
1ad90 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
1ada0 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
1adb0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
1adc0 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
1add0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
1ade0 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
1adf0 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
1ae00 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
1ae10 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
1ae20 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
1ae30 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
1ae40 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
1ae50 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
1ae60 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
1ae70 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
1ae80 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1ae90 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
1aea0 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
1aeb0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
1aec0 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
1aed0 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
1aee0 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
1aef0 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
1af00 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
1af10 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
1af20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
1af30 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
1af40 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1af50 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2f 0a  struction.  .*/.
1af60 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
1af70 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
1af80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
1af90 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
1afa0 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
1afb0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
1afc0 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
1afd0 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
1afe0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
1aff0 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
1b000 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
1b010 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
1b020 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
1b030 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
1b040 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
1b050 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
1b060 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
1b070 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
1b080 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1b090 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
1b0a0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
1b0b0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
1b0c0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
1b0d0 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
1b0e0 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
1b0f0 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
1b100 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
1b110 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
1b120 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
1b130 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
1b140 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
1b150 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57  PIWhere,    /* W
1b160 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
1b170 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
1b180 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
1b190 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
1b1a0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
1b1b0 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
1b1c0 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
1b1d0 66 4e 6f 74 45 78 69 73 74 2c 20 20 20 20 2f 2a  fNotExist,    /*
1b1e0 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
1b1f0 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
1b200 73 74 73 20 2a 2f 0a 20 20 75 38 20 69 64 78 54  sts */.  u8 idxT
1b210 79 70 65 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ype         /* T
1b220 68 65 20 69 6e 64 65 78 20 74 79 70 65 20 2a 2f  he index type */
1b230 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
1b240 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
1b250 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
1b260 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
1b270 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
1b280 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
1b290 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
1b2a0 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
1b2b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1b2c0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
1b2d0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
1b2e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
1b2f0 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
1b300 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
1b310 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
1b320 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
1b330 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
1b340 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
1b350 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
1b360 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
1b370 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
1b380 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
1b390 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
1b3a0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1b3b0 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b3d0 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
1b3e0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1b3f0 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
1b400 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
1b410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b420 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
1b430 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
1b440 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
1b450 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
1b460 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
1b470 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
1b480 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
1b490 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
1b4a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
1b4b0 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
1b4c0 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
1b4d0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
1b4e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1b4f0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
1b500 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78  llocated for zEx
1b510 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  tra[] */.  int n
1b520 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20  ExtraCol;       
1b530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b540 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63  umber of extra c
1b550 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f  olumns needed */
1b560 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20  .  char *zExtra 
1b570 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1b580 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61      /* Extra spa
1b590 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
1b5a0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49  ex object */.  I
1b5b0 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20  ndex *pPk = 0;  
1b5c0 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b      /* PRIMARY K
1b5d0 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54  EY index for WIT
1b5e0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1b5f0 73 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e  s */..  if( db->
1b600 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1b610 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
1b620 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1b630 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b640 7d 0a 20 20 69 66 28 20 49 4e 5f 44 45 43 4c 41  }.  if( IN_DECLA
1b650 52 45 5f 56 54 41 42 20 26 26 20 69 64 78 54 79  RE_VTAB && idxTy
1b660 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
1b670 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 7b  PE_PRIMARYKEY ){
1b680 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
1b690 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
1b6a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1b6b0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1b6c0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1b6d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b6e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
1b6f0 20 69 66 28 20 73 71 6c 69 74 65 33 48 61 73 45   if( sqlite3HasE
1b700 78 70 6c 69 63 69 74 4e 75 6c 6c 73 28 70 50 61  xplicitNulls(pPa
1b710 72 73 65 2c 20 70 4c 69 73 74 29 20 29 7b 0a 20  rse, pList) ){. 
1b720 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1b730 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
1b740 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
1b750 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
1b760 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
1b770 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
1b780 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
1b790 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
1b7a0 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
1b7b0 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
1b7c0 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
1b7d0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
1b7e0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
1b7f0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
1b800 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
1b810 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
1b820 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
1b830 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
1b840 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
1b850 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
1b860 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
1b870 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
1b880 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
1b890 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
1b8a0 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
1b8b0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
1b8c0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1b8d0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
1b8e0 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
1b8f0 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
1b900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
1b910 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
1b920 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
1b930 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
1b940 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
1b950 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
1b960 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
1b970 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
1b980 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
1b990 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
1b9a0 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
1b9b0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
1b9c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
1b9d0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
1b9e0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
1b9f0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
1ba00 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
1ba10 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
1ba20 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
1ba30 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
1ba40 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
1ba50 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
1ba60 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
1ba70 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
1ba80 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
1ba90 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
1baa0 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
1bab0 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
1bac0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
1bad0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
1bae0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
1baf0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
1bb00 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
1bb10 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
1bb20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
1bb30 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
1bb40 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
1bb50 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
1bb60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
1bb70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
1bb80 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
1bb90 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
1bba0 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
1bbb0 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
1bbc0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1bbd0 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
1bbe0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
1bbf0 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
1bc00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
1bc10 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
1bc20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1bc30 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
1bc40 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
1bc50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1bc60 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
1bc70 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
1bc80 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
1bc90 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
1bca0 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
1bcb0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
1bcc0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
1bcd0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1bce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
1bcf0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
1bd00 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
1bd10 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
1bd20 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
1bd30 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
1bd40 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1bd50 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
1bd60 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
1bd70 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
1bd80 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
1bd90 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1bda0 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
1bdb0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
1bdc0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
1bdd0 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
1bde0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
1bdf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
1be00 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
1be10 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1be20 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
1be30 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
1be40 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
1be50 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
1be60 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
1be70 79 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  y==0.       && p
1be80 54 62 6c 4e 61 6d 65 21 3d 30 0a 23 69 66 20 53  TblName!=0.#if S
1be90 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
1bea0 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 20  NTICATION.      
1beb0 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41   && sqlite3UserA
1bec0 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a  uthTable(pTab->z
1bed0 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a  Name)==0.#endif.
1bee0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c  #ifdef SQLITE_AL
1bef0 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41 53 54 45  LOW_SQLITE_MASTE
1bf00 52 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 26  R_INDEX.       &
1bf10 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
1bf20 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
1bf30 2c 22 6d 61 73 74 65 72 22 29 21 3d 30 0a 23 65  ,"master")!=0.#e
1bf40 6e 64 69 66 0a 20 29 7b 0a 20 20 20 20 73 71 6c  ndif. ){.    sql
1bf50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1bf60 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
1bf70 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
1bf80 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
1bf90 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1bfa0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1bfb0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1bfc0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
1bfd0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
1bfe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1bff0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
1c000 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
1c010 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
1c020 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1c030 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
1c040 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1c050 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1c060 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
1c070 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1c080 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c090 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
1c0a0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
1c0b0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
1c0c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
1c0d0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
1c0e0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
1c0f0 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
1c100 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
1c110 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
1c120 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
1c130 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
1c140 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
1c150 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
1c160 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
1c170 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
1c180 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
1c190 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
1c1a0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
1c1b0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
1c1c0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
1c1d0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
1c1e0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
1c1f0 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
1c200 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
1c210 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
1c220 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
1c230 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1c240 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
1c250 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
1c260 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
1c270 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
1c280 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
1c290 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
1c2a0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
1c2b0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
1c2c0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
1c2d0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
1c2e0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
1c2f0 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
1c300 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
1c310 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
1c320 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1c330 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1c340 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
1c350 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
1c360 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
1c370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1c380 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
1c390 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c3a0 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
1c3b0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
1c3c0 4e 61 6d 65 2c 22 69 6e 64 65 78 22 2c 70 54 61  Name,"index",pTa
1c3d0 62 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  b->zName) ){.   
1c3e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1c3f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
1c400 0a 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e  .    if( !IN_REN
1c410 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
1c420 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
1c430 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
1c440 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
1c450 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
1c460 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)!=0 ){.     
1c470 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1c480 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
1c490 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1c4a0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
1c4b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1c4c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1c4d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1c4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c4f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
1c500 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
1c510 6d 65 2c 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d  me, pDb->zDbSNam
1c520 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1c530 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74   if( !ifNotExist
1c540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1c550 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c560 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
1c570 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
1c580 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1c590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c5a0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
1c5b0 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
1c5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1c5d0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1c5e0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1c5f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
1c600 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1c610 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1c620 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c630 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65   int n;.    Inde
1c640 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f  x *pLoop;.    fo
1c650 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49  r(pLoop=pTab->pI
1c660 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70  ndex, n=1; pLoop
1c670 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
1c680 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  Next, n++){}.   
1c690 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
1c6a0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
1c6b0 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73  ite_autoindex_%s
1c6c0 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  _%d", pTab->zNam
1c6d0 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, n);.    if( z
1c6e0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1c6f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c700 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 0a  e_index;.    }..
1c710 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
1c720 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 67 65 6e   index names gen
1c730 65 72 61 74 65 64 20 66 72 6f 6d 20 77 69 74 68  erated from with
1c740 69 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  in sqlite3_decla
1c750 72 65 5f 76 74 61 62 28 29 0a 20 20 20 20 2a 2a  re_vtab().    **
1c760 20 6d 75 73 74 20 68 61 76 65 20 6e 61 6d 65 73   must have names
1c770 20 74 68 61 74 20 61 72 65 20 64 69 73 74 69 6e   that are distin
1c780 63 74 20 66 72 6f 6d 20 6e 6f 72 6d 61 6c 20 61  ct from normal a
1c790 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 6e  utomatic index n
1c7a0 61 6d 65 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ames..    ** The
1c7b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
1c7c0 6d 65 6e 74 20 63 6f 6e 76 65 72 74 73 20 22 73  ment converts "s
1c7d0 71 6c 69 74 65 33 5f 61 75 74 6f 69 6e 64 65 78  qlite3_autoindex
1c7e0 2e 2e 2e 22 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ..." into.    **
1c7f0 20 22 73 71 6c 69 74 65 33 5f 62 75 74 6f 69 6e   "sqlite3_butoin
1c800 64 65 78 2e 2e 2e 22 20 69 6e 20 6f 72 64 65 72  dex..." in order
1c810 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
1c820 65 73 20 64 69 73 74 69 6e 63 74 2e 0a 20 20 20  es distinct..   
1c830 20 2a 2a 20 54 68 65 20 22 76 74 61 62 5f 65 72   ** The "vtab_er
1c840 72 2e 74 65 73 74 22 20 74 65 73 74 20 64 65 6d  r.test" test dem
1c850 6f 6e 73 74 72 61 74 65 73 20 74 68 65 20 6e 65  onstrates the ne
1c860 65 64 20 6f 66 20 74 68 69 73 20 73 74 61 74 65  ed of this state
1c870 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ment. */.    if(
1c880 20 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52 53   IN_SPECIAL_PARS
1c890 45 20 29 20 7a 4e 61 6d 65 5b 37 5d 2b 2b 3b 0a  E ) zName[7]++;.
1c8a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1c8b0 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  for authorizatio
1c8c0 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69  n to create an i
1c8d0 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ndex..  */.#ifnd
1c8e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c8f0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69  UTHORIZATION.  i
1c900 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  f( !IN_RENAME_OB
1c910 4a 45 43 54 20 29 7b 0a 20 20 20 20 63 6f 6e 73  JECT ){.    cons
1c920 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
1c930 62 2d 3e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b->zDbSName;.   
1c940 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1c950 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1c960 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
1c970 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
1c980 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1c990 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1c9a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1c9b0 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
1c9c0 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
1c9d0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1c9e0 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
1c9f0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
1ca00 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
1ca10 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1ca20 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
1ca30 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
1ca40 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
1ca50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ca60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
1ca70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ca80 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
1ca90 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
1caa0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
1cab0 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
1cac0 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
1cad0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
1cae0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
1caf0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
1cb00 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
1cb10 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
1cb20 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
1cb30 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
1cb40 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
1cb50 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
1cb60 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1cb70 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61   &pTab->aCol[pTa
1cb80 62 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 20 20  b->nCol-1];.    
1cb90 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
1cba0 3d 20 43 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45  = COLFLAG_UNIQUE
1cbb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b  ;.    sqlite3Tok
1cbc0 65 6e 49 6e 69 74 28 26 70 72 65 76 43 6f 6c 2c  enInit(&prevCol,
1cbd0 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
1cbe0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1cbf0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1cc00 28 70 50 61 72 73 65 2c 20 30 2c 0a 20 20 20 20  (pParse, 0,.    
1cc10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cc20 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
1cc30 4b 5f 49 44 2c 20 26 70 72 65 76 43 6f 6c 2c 20  K_ID, &prevCol, 
1cc40 30 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  0));.    if( pLi
1cc50 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
1cc60 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1cc70 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1cc80 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  t->nExpr==1 );. 
1cc90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1cca0 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 70  stSetSortOrder(p
1ccb0 4c 69 73 74 2c 20 73 6f 72 74 4f 72 64 65 72 2c  List, sortOrder,
1ccc0 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46   SQLITE_SO_UNDEF
1ccd0 49 4e 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  INED);.  }else{.
1cce0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1ccf0 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70  istCheckLength(p
1cd00 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69  Parse, pList, "i
1cd10 6e 64 65 78 22 29 3b 0a 20 20 20 20 69 66 28 20  ndex");.    if( 
1cd20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
1cd30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
1cd40 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
1cd50 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1cd60 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
1cd70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
1cd80 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
1cd90 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
1cda0 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
1cdb0 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
1cdc0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1cdd0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1cde0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1cdf0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
1ce00 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ].pExpr;.    ass
1ce10 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
1ce20 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1ce30 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
1ce40 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
1ce50 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
1ce60 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e  rlen30(pExpr->u.
1ce70 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a  zToken));.    }.
1ce80 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20    }..  /* .  ** 
1ce90 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  Allocate the ind
1cea0 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20  ex structure. . 
1ceb0 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71   */.  nName = sq
1cec0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
1ced0 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f  ame);.  nExtraCo
1cee0 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e  l = pPk ? pPk->n
1cef0 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 61 73  KeyCol : 1;.  as
1cf00 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
1cf10 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 20 3c  pr + nExtraCol <
1cf20 3d 20 33 32 37 36 37 20 2f 2a 20 46 69 74 73 20  = 32767 /* Fits 
1cf30 69 6e 20 69 31 36 20 2a 2f 20 29 3b 0a 20 20 70  in i16 */ );.  p
1cf40 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
1cf50 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
1cf60 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
1cf70 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
1cf80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
1cfb0 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
1cfc0 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
1cfd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1cfe0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1cff0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
1d000 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1d010 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
1d020 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
1d030 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
1d040 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1d050 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
1d060 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
1d070 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
1d080 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
1d090 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
1d0a0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
1d0b0 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
1d0c0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
1d0d0 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
1d0e0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
1d0f0 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
1d100 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
1d110 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
1d120 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
1d130 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 70  idxType = idxTyp
1d140 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  e;.  pIndex->pSc
1d150 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
1d160 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
1d170 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d  Index->nKeyCol =
1d180 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1d190 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b   if( pPIWhere ){
1d1a0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1d1b0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
1d1c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
1d1d0 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68  C_PartIdx, pPIWh
1d1e0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e  ere, 0);.    pIn
1d1f0 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  dex->pPartIdxWhe
1d200 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20  re = pPIWhere;. 
1d210 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b     pPIWhere = 0;
1d220 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
1d230 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
1d240 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
1d250 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
1d260 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
1d270 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
1d280 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
1d290 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
1d2a0 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
1d2b0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
1d2c0 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
1d2d0 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
1d2e0 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
1d2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
1d300 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
1d310 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
1d320 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  C */.  }..  /* A
1d330 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20  nalyze the list 
1d340 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
1d350 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72  hat form the ter
1d360 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ms of the index 
1d370 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20  and.  ** report 
1d380 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20  any errors.  In 
1d390 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
1d3a0 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65 73  where the expres
1d3b0 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a  sion is exactly.
1d3c0 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c    ** a table col
1d3d0 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20  umn, store that 
1d3e0 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75  column in aiColu
1d3f0 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72  mn[].  For gener
1d400 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  al expressions,.
1d410 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49    ** populate pI
1d420 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61  ndex->aColExpr a
1d430 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52  nd store XN_EXPR
1d440 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d   (-2) in aiColum
1d450 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n[]..  **.  ** T
1d460 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72  ODO: Issue a war
1d470 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d  ning if two or m
1d480 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ore columns of t
1d490 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64 65  he index are ide
1d4a0 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44  ntical..  ** TOD
1d4b0 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
1d4c0 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ng if the table 
1d4d0 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75  primary key is u
1d4e0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1d4f0 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65  he.  ** index ke
1d500 79 2e 0a 20 20 2a 2f 0a 20 20 70 4c 69 73 74 49  y..  */.  pListI
1d510 74 65 6d 20 3d 20 70 4c 69 73 74 2d 3e 61 3b 0a  tem = pList->a;.
1d520 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
1d530 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 70 49  OBJECT ){.    pI
1d540 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d  ndex->aColExpr =
1d550 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73   pList;.    pLis
1d560 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72  t = 0;.  }.  for
1d570 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
1d580 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 2c 20 70 4c  nKeyCol; i++, pL
1d590 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
1d5a0 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20  Expr *pCExpr;   
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d5c0 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78  * The i-th index
1d5d0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1d5e0 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64     int requested
1d5f0 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20  SortOrder;      
1d600 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43    /* ASC or DESC
1d610 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70   on the i-th exp
1d620 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ression */.    c
1d630 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1d640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d650 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
1d660 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20  nce name */..   
1d670 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f   sqlite3StringTo
1d680 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  Id(pListItem->pE
1d690 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
1d6a0 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
1d6b0 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54  rence(pParse, pT
1d6c0 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20  ab, NC_IdxExpr, 
1d6d0 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
1d6e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
1d6f0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74  arse->nErr ) got
1d700 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1d710 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20  dex;.    pCExpr 
1d720 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1d730 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74  pCollate(pListIt
1d740 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1d750 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d  if( pCExpr->op!=
1d760 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1d770 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61     if( pTab==pPa
1d780 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
1d790 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d7a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1d7b0 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70  , "expressions p
1d7c0 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49  rohibited in PRI
1d7d0 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20  MARY KEY and ". 
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d800 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1d810 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ts");.        go
1d820 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1d830 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
1d840 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
1d850 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20  aColExpr==0 ){. 
1d860 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
1d870 43 6f 6c 45 78 70 72 20 3d 20 70 4c 69 73 74 3b  ColExpr = pList;
1d880 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d  .        pList =
1d890 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d8a0 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20    j = XN_EXPR;. 
1d8b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
1d8c0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f 45 58  olumn[i] = XN_EX
1d8d0 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
1d8e0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1d8f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1d900 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72 2d 3e      j = pCExpr->
1d910 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 61  iColumn;.      a
1d920 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
1d930 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3c   );.      if( j<
1d940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 3d  0 ){.        j =
1d950 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
1d960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
1d970 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
1d980 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
1d990 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1d9a0 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  tNull = 0;.     
1d9b0 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
1d9c0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28  >aiColumn[i] = (
1d9d0 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20 20 20  i16)j;.    }.   
1d9e0 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   zColl = 0;.    
1d9f0 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
1da00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1da10 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  LATE ){.      in
1da20 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
1da30 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
1da40 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ->pExpr->u.zToke
1da50 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d  n;.      nColl =
1da60 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1da70 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20  (zColl) + 1;.   
1da80 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
1da90 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20  a>=nColl );.    
1daa0 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
1dab0 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a   zColl, nColl);.
1dac0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45        zColl = zE
1dad0 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74  xtra;.      zExt
1dae0 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra += nColl;.   
1daf0 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f     nExtra -= nCo
1db00 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
1db10 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( j>=0 ){.      
1db20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
1db30 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
1db40 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c   }.    if( !zCol
1db50 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  l ) zColl = sqli
1db60 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20  te3StrBINARY;.  
1db70 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1db80 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
1db90 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1dba0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
1dbb0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1dbc0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1dbd0 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
1dbe0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
1dbf0 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
1dc00 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
1dc10 74 49 74 65 6d 2d 3e 73 6f 72 74 46 6c 61 67 73  tItem->sortFlags
1dc20 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
1dc30 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
1dc40 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
1dc50 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
1dc60 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
1dc70 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65  Append the table
1dc80 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20   key to the end 
1dc90 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46  of the index.  F
1dca0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1dcb0 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68  .  ** tables (wh
1dcc0 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20  en pPk!=0) this 
1dcd0 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c  will be the decl
1dce0 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  ared PRIMARY KEY
1dcf0 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d  .  For.  ** norm
1dd00 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  al tables (when 
1dd10 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk==0) this wil
1dd20 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a  l be the rowid..
1dd30 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29    */.  if( pPk )
1dd40 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
1dd50 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1dd60 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
1dd70 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
1dd80 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
1dd90 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
1dda0 20 69 66 28 20 69 73 44 75 70 43 6f 6c 75 6d 6e   if( isDupColumn
1ddb0 28 70 49 6e 64 65 78 2c 20 70 49 6e 64 65 78 2d  (pIndex, pIndex-
1ddc0 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2c 20 6a  >nKeyCol, pPk, j
1ddd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  ) ){.        pIn
1dde0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20  dex->nColumn--; 
1ddf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1de00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1de10 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
1de20 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 70 49 6e 64 65  ->aiColumn,pInde
1de30 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 78 29 20 29 3b  x->nKeyCol,x) );
1de40 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1de50 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78  >aiColumn[i] = x
1de60 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1de70 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  ->azColl[i] = pP
1de80 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  k->azColl[j];.  
1de90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53        pIndex->aS
1dea0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50  ortOrder[i] = pP
1deb0 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
1dec0 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
1ded0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dee0 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64   assert( i==pInd
1def0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ex->nColumn );. 
1df00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64   }else{.    pInd
1df10 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1df20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
1df30 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1df40 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  ] = sqlite3StrBI
1df50 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  NARY;.  }.  sqli
1df60 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1df70 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
1df80 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
1df90 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
1dfa0 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
1dfb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1dfc0 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e 73 20   index contains 
1dfd0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
1dfe0 69 74 73 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  its table, then 
1dff0 6d 61 72 6b 0a 20 20 2a 2a 20 69 74 20 61 73 20  mark.  ** it as 
1e000 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1e010 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 48 61   */.  assert( Ha
1e020 73 52 6f 77 69 64 28 70 54 61 62 29 20 0a 20 20  sRowid(pTab) .  
1e030 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 69 50 4b      || pTab->iPK
1e040 65 79 3c 30 20 7c 7c 20 73 71 6c 69 74 65 33 54  ey<0 || sqlite3T
1e050 61 62 6c 65 43 6f 6c 75 6d 6e 54 6f 49 6e 64 65  ableColumnToInde
1e060 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e  x(pIndex, pTab->
1e070 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72  iPKey)>=0 );.  r
1e080 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e  ecomputeColumnsN
1e090 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78  otIndexed(pIndex
1e0a0 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  );.  if( pTblNam
1e0b0 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e  e!=0 && pIndex->
1e0c0 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e  nColumn>=pTab->n
1e0d0 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65  Col ){.    pInde
1e0e0 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20  x->isCovering = 
1e0f0 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  1;.    for(j=0; 
1e100 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
1e110 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d  +){.      if( j=
1e120 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63  =pTab->iPKey ) c
1e130 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1e140 66 28 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43  f( sqlite3TableC
1e150 6f 6c 75 6d 6e 54 6f 49 6e 64 65 78 28 70 49 6e  olumnToIndex(pIn
1e160 64 65 78 2c 6a 29 3e 3d 30 20 29 20 63 6f 6e 74  dex,j)>=0 ) cont
1e170 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 49 6e 64  inue;.      pInd
1e180 65 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  ex->isCovering =
1e190 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1e1a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e1b0 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1e1c0 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1e1d0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
1e1e0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1e1f0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
1e200 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
1e210 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
1e220 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
1e230 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1e240 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
1e250 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
1e260 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
1e270 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1e280 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
1e290 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
1e2a0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
1e2b0 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
1e2c0 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1e2d0 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
1e2e0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
1e2f0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1e300 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
1e310 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
1e320 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
1e330 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1e340 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
1e350 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
1e360 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
1e370 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
1e380 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
1e390 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
1e3a0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
1e3b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1e3c0 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
1e3d0 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
1e3e0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
1e3f0 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
1e400 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1e410 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
1e420 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1e430 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
1e440 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
1e450 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
1e460 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
1e470 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
1e480 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
1e490 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
1e4a0 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
1e4b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1e4c0 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
1e4d0 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
1e4e0 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
1e4f0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
1e500 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
1e510 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
1e520 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
1e530 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
1e540 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
1e550 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
1e560 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
1e570 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
1e580 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
1e590 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1e5a0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1e5b0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
1e5c0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1e5d0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
1e5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1e5f0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1e600 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
1e610 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
1e620 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1e630 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
1e640 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
1e650 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
1e660 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
1e670 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
1e680 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
1e690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
1e6a0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
1e6b0 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
1e6c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1e6d0 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
1e6e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
1e6f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e700 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1e710 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
1e720 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
1e730 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
1e740 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
1e750 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  k;.        z1 = 
1e760 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
1e770 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49  .        z2 = pI
1e780 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
1e790 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1e7a0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
1e7b0 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
1e7c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
1e7d0 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
1e7e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1e7f0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
1e800 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
1e810 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
1e820 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
1e830 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
1e840 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
1e850 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
1e860 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
1e870 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
1e880 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
1e890 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
1e8a0 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
1e8b0 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
1e8c0 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
1e8d0 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
1e8e0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
1e8f0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
1e900 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
1e910 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
1e920 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
1e930 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
1e940 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
1e950 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
1e960 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
1e970 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
1e980 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
1e990 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
1e9a0 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  avior for the in
1e9b0 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
1e9c0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1e9d0 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
1e9e0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
1e9f0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1ea00 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
1ea10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ea20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ea30 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1ea40 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
1ea50 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1ea60 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
1ea70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
1ea80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ea90 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
1eaa0 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
1eab0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
1eac0 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
1ead0 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
1eae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1eaf0 20 20 20 20 20 20 20 69 66 28 20 69 64 78 54 79         if( idxTy
1eb00 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
1eb10 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 20 29 20  PE_PRIMARYKEY ) 
1eb20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  pIdx->idxType = 
1eb30 69 64 78 54 79 70 65 3b 0a 20 20 20 20 20 20 20  idxType;.       
1eb40 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
1eb50 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  BJECT ){.       
1eb60 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1eb70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49   = pParse->pNewI
1eb80 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 20 20  ndex;.          
1eb90 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65  pParse->pNewInde
1eba0 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1ebb0 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
1ebc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ebd0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
1ebe0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
1ebf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1ec00 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f   if( !IN_RENAME_
1ec10 4f 42 4a 45 43 54 20 29 7b 0a 0a 20 20 20 20 2f  OBJECT ){..    /
1ec20 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
1ec30 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
1ec40 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
1ec50 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20  to the other.   
1ec60 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   ** in-memory da
1ec70 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
1ec80 73 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  s. .    */.    a
1ec90 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1eca0 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Err==0 );.    if
1ecb0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
1ecc0 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  ){.      Index *
1ecd0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
1ece0 20 21 49 4e 5f 53 50 45 43 49 41 4c 5f 50 41 52   !IN_SPECIAL_PAR
1ecf0 53 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SE );.      asse
1ed00 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
1ed10 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
1ed20 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
1ed30 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a) );.      if( 
1ed40 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  pTblName!=0 ){. 
1ed50 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74         pIndex->t
1ed60 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
1ed70 65 77 54 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ewTnum;.        
1ed80 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1ed90 48 61 73 44 75 70 6c 69 63 61 74 65 52 6f 6f 74  HasDuplicateRoot
1eda0 50 61 67 65 28 70 49 6e 64 65 78 29 20 29 7b 0a  Page(pIndex) ){.
1edb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1edc0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1edd0 2c 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74 70  , "invalid rootp
1ede0 61 67 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20  age");.         
1edf0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1ee00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ee10 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
1ee20 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
1ee30 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dex;.        }. 
1ee40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 20 3d       }.      p =
1ee50 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
1ee60 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt(&pIndex->pSch
1ee70 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20  ema->idxHash, . 
1ee80 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d           pIndex-
1ee90 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b  >zName, pIndex);
1eea0 0a 20 20 20 20 20 20 69 66 28 20 70 20 29 7b 0a  .      if( p ){.
1eeb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1eec0 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a  p==pIndex );  /*
1eed0 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
1eee0 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  e failed */.    
1eef0 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
1ef00 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ult(db);.       
1ef10 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1ef20 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
1ef30 0a 20 20 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c  .      db->mDbFl
1ef40 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63  ags |= DBFLAG_Sc
1ef50 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 20 20  hemaChange;.    
1ef60 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1ef70 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
1ef80 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1ef90 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41  atement (or CREA
1efa0 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a  TE TABLE if the.
1efb0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20      ** index is 
1efc0 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
1efd0 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
1efe0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1eff0 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
1f000 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74    ** emit code t
1f010 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  o allocate the i
1f020 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e  ndex rootpage on
1f030 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61   disk and make a
1f040 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20  n entry for.    
1f050 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  ** the index in 
1f060 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1f070 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75  r table and popu
1f080 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77  late the index w
1f090 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  ith.    ** conte
1f0a0 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1f0b0 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1f0c0 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1f0d0 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1f0e0 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ter.    ** table
1f0f0 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63   to parse the sc
1f100 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73  hema, or if this
1f110 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52   index is the PR
1f120 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a  IMARY KEY index.
1f130 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48      ** of a WITH
1f140 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1f150 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f160 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
1f170 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
1f180 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
1f190 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49  s an implied PRI
1f1a0 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a 20  MARY KEY.    ** 
1f1b0 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
1f1c0 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1f1d0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
1f1e0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
1f1f0 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
1f200 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
1f210 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
1f220 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
1f230 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
1f240 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
1f250 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
1f260 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 73      else if( Has
1f270 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 70  Rowid(pTab) || p
1f280 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
1f290 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
1f2a0 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
1f2b0 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d        int iMem =
1f2c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1f2d0 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c 69  ..      v = sqli
1f2e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1f2f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d  e);.      if( v=
1f300 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
1f310 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20  reate_index;..  
1f320 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1f330 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1f340 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1f350 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
1f360 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
1f370 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  r the index usin
1f380 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 42  g CreateIndex. B
1f390 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  ut before.      
1f3a0 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f 64  ** doing so, cod
1f3b0 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 63  e a Noop instruc
1f3c0 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 69  tion and store i
1f3d0 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a 20  ts address in . 
1f3e0 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 6e       ** Index.tn
1f3f0 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  um. This is requ
1f400 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 69  ired in case thi
1f410 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 61  s index is actua
1f420 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a 20  lly a .      ** 
1f430 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20  PRIMARY KEY and 
1f440 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 74  the table is act
1f450 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 20  ually a WITHOUT 
1f460 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e 20  ROWID table. In 
1f470 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63  .      ** that c
1f480 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54  ase the convertT
1f490 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62  oWithoutRowidTab
1f4a0 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  le() routine wil
1f4b0 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 20  l replace.      
1f4c0 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1f4d0 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1f4e0 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1f4f0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1f500 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 6e  ow. */.      pIn
1f510 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69  dex->tnum = sqli
1f520 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
1f530 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 20   OP_Noop);.     
1f540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f550 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 42  p3(v, OP_CreateB
1f560 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d 2c  tree, iDb, iMem,
1f570 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 3b   BTREE_BLOBKEY);
1f580 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 65  ..      /* Gathe
1f590 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
1f5a0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
1f5b0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1f5c0 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  t into.      ** 
1f5d0 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62  the zStmt variab
1f5e0 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
1f5f0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 21    assert( pName!
1f600 3d 30 20 7c 7c 20 70 53 74 61 72 74 3d 3d 30 20  =0 || pStart==0 
1f610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
1f620 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
1f630 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61  nt n = (int)(pPa
1f640 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1f650 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20  z - pName->z) + 
1f660 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1f670 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  en.n;.        if
1f680 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d  ( pName->z[n-1]=
1f690 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20  =';' ) n--;.    
1f6a0 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
1f6b0 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
1f6c0 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
1f6d0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
1f6e0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20          zStmt = 
1f6f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1f700 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
1f710 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
1f720 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
1f730 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
1f740 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d  UNIQUE", n, pNam
1f750 65 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e->z);.      }el
1f760 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  se{.        /* A
1f770 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1f780 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1f790 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1f7a0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1f7b0 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 7a 53  */.        /* zS
1f7c0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1f7d0 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20  intf(""); */.   
1f7e0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a       zStmt = 0;.
1f7f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f800 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
1f810 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
1f820 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
1f830 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
1f840 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1f850 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1f860 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1f870 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1f880 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1f890 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  %Q);",.         
1f8a0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
1f8b0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e  bSName, MASTER_N
1f8c0 41 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70  AME,.          p
1f8d0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
1f8e0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1f8f0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 69  ame,.          i
1f900 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  Mem,.          z
1f910 53 74 6d 74 0a 20 20 20 20 20 20 20 20 20 20 29  Stmt.          )
1f920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
1f930 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1f940 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  ;..      /* Fill
1f950 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1f960 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
1f970 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
1f980 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
1f990 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c       ** to inval
1f9a0 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
1f9b0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
1f9c0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
1f9d0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
1f9e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f9f0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1fa00 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
1fa10 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
1fa20 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1fa30 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1fa40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fa50 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
1fa60 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
1fa70 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1fa80 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1fa90 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1faa0 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1fab0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
1fac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fad0 32 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  2(v, OP_Expire, 
1fae0 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 1);.      }..
1faf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fb00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
1fb10 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a 20 20 20 20  dex->tnum);.    
1fb20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
1fb30 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
1fb40 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1fb50 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
1fb60 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
1fb70 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
1fb80 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
1fb90 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
1fba0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
1fbb0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
1fbc0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1fbd0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
1fbe0 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
1fbf0 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
1fc00 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
1fc10 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
1fc20 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
1fc30 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
1fc40 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
1fc50 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
1fc60 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1fc70 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
1fc80 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
1fc90 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
1fca0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
1fcb0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
1fcc0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
1fcd0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
1fce0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
1fcf0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
1fd00 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
1fd10 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
1fd20 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
1fd30 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
1fd40 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
1fd50 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
1fd60 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
1fd70 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
1fd80 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
1fd90 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
1fda0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
1fdb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
1fdc0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
1fdd0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
1fde0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
1fdf0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
1fe00 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
1fe10 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ndex = 0;.  }.  
1fe20 65 6c 73 65 20 69 66 28 20 49 4e 5f 52 45 4e 41  else if( IN_RENA
1fe30 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
1fe40 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1fe50 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30 20 29 3b  >pNewIndex==0 );
1fe60 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
1fe70 77 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  wIndex = pIndex;
1fe80 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1fe90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
1fea0 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
1feb0 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
1fec0 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
1fed0 49 6e 64 65 78 20 29 20 73 71 6c 69 74 65 33 46  Index ) sqlite3F
1fee0 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
1fef0 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  dex);.  sqlite3E
1ff00 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50  xprDelete(db, pP
1ff10 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  IWhere);.  sqlit
1ff20 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1ff30 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
1ff40 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1ff50 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
1ff60 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1ff70 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  ee(db, zName);.}
1ff80 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1ff90 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b   Index.aiRowEst[
1ffa0 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66  ] array with def
1ffb0 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ault information
1ffc0 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a   - information.*
1ffd0 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65  * to be used whe
1ffe0 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75  n we have not ru
1fff0 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f  n the ANALYZE co
20000 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52  mmand..**.** aiR
20010 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70  owEst[0] is supp
20020 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  osed to contain 
20030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
20040 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
20050 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
20060 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
20070 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
20080 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
20090 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
200a0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
200b0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
200c0 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
200d0 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
200e0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
200f0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
20100 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
20110 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
20120 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
20130 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
20140 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
20150 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ular combination
20160 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20   of the first 2 
20170 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68  columns.** of th
20180 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f  e index.  And so
20190 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74   forth.  It must
201a0 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63   always be the c
201b0 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20  ase that.*.**   
201c0 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
201d0 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d  [N]<=aiRowEst[N-
201e0 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  1].**           
201f0 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a  aiRowEst[N]>=1.*
20200 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20  *.** Apart from 
20210 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69  that, we have li
20220 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65  ttle to go on be
20230 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20  sides intuition 
20240 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52  as to.** how aiR
20250 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62  owEst[] should b
20260 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
20270 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65  The numbers gene
20280 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72  rated here.** ar
20290 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63  e based on typic
202a0 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20  al values found 
202b0 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65  in actual indice
202c0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
202d0 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28  e3DefaultRowEst(
202e0 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
202f0 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /*              
20300 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20 37    10,  9,  8,  7
20310 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ,  6 */.  LogEst
20320 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20   aVal[] = { 33, 
20330 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20 7d  32, 30, 28, 26 }
20340 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d 20  ;.  LogEst *a = 
20350 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
20360 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d  t;.  int nCopy =
20370 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28 61   MIN(ArraySize(a
20380 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  Val), pIdx->nKey
20390 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Col);.  int i;..
203a0 20 20 2f 2a 20 49 6e 64 65 78 65 73 20 77 69 74    /* Indexes wit
203b0 68 20 64 65 66 61 75 6c 74 20 72 6f 77 20 65 73  h default row es
203c0 74 69 6d 61 74 65 73 20 73 68 6f 75 6c 64 20 6e  timates should n
203d0 6f 74 20 68 61 76 65 20 73 74 61 74 31 20 64 61  ot have stat1 da
203e0 74 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ta */.  assert( 
203f0 21 70 49 64 78 2d 3e 68 61 73 53 74 61 74 31 20  !pIdx->hasStat1 
20400 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
20410 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75   first entry (nu
20420 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
20430 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68  the index) to th
20440 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a  e estimated .  *
20450 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
20460 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 6f   in the table, o
20470 72 20 68 61 6c 66 20 74 68 65 20 6e 75 6d 62 65  r half the numbe
20480 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
20490 20 74 61 62 6c 65 0a 20 20 2a 2a 20 66 6f 72 20   table.  ** for 
204a0 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
204b0 20 20 20 42 75 74 20 64 6f 20 6e 6f 74 20 6c 65     But do not le
204c0 74 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 64  t the estimate d
204d0 72 6f 70 20 62 65 6c 6f 77 20 31 30 2e 20 2a 2f  rop below 10. */
204e0 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e  .  a[0] = pIdx->
204f0 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
20500 73 74 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  st;.  if( pIdx->
20510 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
20520 20 29 20 61 5b 30 5d 20 2d 3d 20 31 30 3b 20 20   ) a[0] -= 10;  
20530 61 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69  assert( 10==sqli
20540 74 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a  te3LogEst(2) );.
20550 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20    if( a[0]<33 ) 
20560 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20  a[0] = 33;      
20570 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
20580 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 33==sqlite3L
20590 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20  ogEst(10) );..  
205a0 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61 74  /* Estimate that
205b0 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32   a[1] is 10, a[2
205c0 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20  ] is 9, a[3] is 
205d0 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b  8, a[4] is 7, a[
205e0 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64  5] is.  ** 6 and
205f0 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
20600 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20   value (if any) 
20610 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63  is 5.  */.  memc
20620 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20  py(&a[1], aVal, 
20630 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67  nCopy*sizeof(Log
20640 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  Est));.  for(i=n
20650 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d  Copy+1; i<=pIdx-
20660 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
20670 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20      a[i] = 23;  
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71    assert( 23==sq
206a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29  lite3LogEst(5) )
206b0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
206c0 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73   0==sqlite3LogEs
206d0 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73  t(1) );.  if( Is
206e0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
206f0 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79  ) ) a[pIdx->nKey
20700 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Col] = 0;.}../*.
20710 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20720 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
20730 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
20740 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
20750 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
20760 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
20770 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
20780 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
20790 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
207a0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
207b0 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
207c0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
207d0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
207e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
207f0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
20800 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  b;..  assert( pP
20810 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
20820 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
20830 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65 72  ed with prior er
20840 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  rors */.  if( db
20850 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20860 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
20870 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
20880 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
20890 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
208a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
208b0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
208c0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
208d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
208e0 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
208f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
20900 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
20910 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
20920 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
20930 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
20940 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
20950 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
20960 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20970 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
20980 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
20990 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ame, 0);.    }el
209a0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
209b0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
209c0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
209d0 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
209e0 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  base);.    }.   
209f0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
20a00 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f  hema = 1;.    go
20a10 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
20a20 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  ex;.  }.  if( pI
20a30 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53  ndex->idxType!=S
20a40 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50  QLITE_IDXTYPE_AP
20a50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69  PDEF ){.    sqli
20a60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
20a70 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
20a80 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
20a90 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
20aa0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
20ab0 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
20ac0 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
20ad0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
20ae0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
20af0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
20b00 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
20b10 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
20b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20b30 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
20b40 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
20b50 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
20b60 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
20b70 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
20b80 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
20b90 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
20ba0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
20bb0 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
20bc0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
20bd0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
20be0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
20bf0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
20c00 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
20c10 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
20c20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
20c30 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
20c40 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
20c50 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
20c60 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
20c70 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
20c80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
20c90 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
20ca0 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
20cb0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
20cc0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
20cd0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
20ce0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
20cf0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
20d00 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
20d10 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
20d20 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
20d30 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
20d40 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20d50 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
20d60 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
20d70 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
20d80 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
20d90 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
20da0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
20db0 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
20dc0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
20dd0 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
20de0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
20df0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
20e00 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d 41 53  b].zDbSName, MAS
20e10 54 45 52 5f 4e 41 4d 45 2c 20 70 49 6e 64 65 78  TER_NAME, pIndex
20e20 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
20e30 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
20e40 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
20e50 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
20e60 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
20e70 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
20e80 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
20e90 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
20ea0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
20eb0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
20ec0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
20ed0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
20ee0 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
20ef0 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
20f00 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
20f10 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
20f20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
20f30 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
20f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
20f50 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
20f60 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
20f70 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
20f80 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
20f90 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
20fa0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
20fb0 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
20fc0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
20fd0 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
20fe0 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
20ff0 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
21000 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
21010 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
21020 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
21030 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
21040 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
21050 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
21060 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
21070 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
21080 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
21090 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
210a0 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
210b0 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
210c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
210d0 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
210e0 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
210f0 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
21100 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
21110 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
21120 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
21130 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
21140 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
21150 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
21160 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
21170 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
21180 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
21190 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
211a0 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
211b0 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
211c0 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
211d0 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
211e0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
211f0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
21200 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
21210 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
21220 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
21230 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
21240 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
21250 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
21260 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
21270 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
21280 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
21290 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
212a0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
212b0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
212c0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
212d0 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
212e0 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
212f0 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
21300 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
21310 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
21320 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
21330 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
21340 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
21350 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21360 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
21370 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
21380 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
21390 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
213a0 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
213b0 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
213c0 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65  har *z;.  sqlite
213d0 33 5f 69 6e 74 36 34 20 6e 20 3d 20 2a 70 49 64  3_int64 n = *pId
213e0 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
213f0 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d  if( (n & (n-1))=
21400 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
21410 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20 28 6e 3d  3_int64 sz = (n=
21420 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20  =0) ? 1 : 2*n;. 
21430 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
21440 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
21450 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a  (db, pArray, sz*
21460 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
21470 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
21480 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
21490 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
214a0 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ay;.    }.    pA
214b0 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  rray = pNew;.  }
214c0 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41  .  z = (char*)pA
214d0 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26  rray;.  memset(&
214e0 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20  z[n * szEntry], 
214f0 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2b  0, szEntry);.  +
21500 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74  +*pnEntry;.  ret
21510 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f  urn pArray;.}../
21520 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65  *.** Append a ne
21530 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
21540 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20   given IdList.  
21550 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c  Create a new IdL
21560 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
21570 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49  e..**.** A new I
21580 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65  dList is returne
21590 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61  d, or NULL if ma
215a0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
215b0 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
215c0 49 64 4c 69 73 74 41 70 70 65 6e 64 28 50 61 72  IdListAppend(Par
215d0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 64 4c 69  se *pParse, IdLi
215e0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
215f0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 71 6c   *pToken){.  sql
21600 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
21610 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
21620 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
21630 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
21640 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
21650 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
21660 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
21670 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
21680 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
21690 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
216a0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
216b0 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
216c0 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
216d0 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
216e0 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
216f0 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
21700 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
21710 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
21720 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
21730 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
21740 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
21750 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
21760 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
21770 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
21780 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  f( IN_RENAME_OBJ
21790 45 43 54 20 26 26 20 70 4c 69 73 74 2d 3e 61 5b  ECT && pList->a[
217a0 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
217b0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
217c0 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 28 76  enMap(pParse, (v
217d0 6f 69 64 2a 29 70 4c 69 73 74 2d 3e 61 5b 69 5d  oid*)pList->a[i]
217e0 2e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b  .zName, pToken);
217f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
21800 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
21810 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
21820 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
21830 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
21840 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
21850 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
21860 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
21870 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
21880 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
21890 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
218a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
218b0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
218c0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
218d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
218e0 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
218f0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
21900 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
21910 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
21920 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
21930 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
21940 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
21950 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
21960 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
21970 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
21980 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
21990 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
219a0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
219b0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
219c0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
219d0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
219e0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
219f0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
21a00 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
21a10 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
21a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
21a30 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  1;.}../*.** Maxi
21a40 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 20 53 72  mum size of a Sr
21a50 63 4c 69 73 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a  cList object..**
21a60 20 54 68 65 20 53 72 63 4c 69 73 74 20 6f 62 6a   The SrcList obj
21a70 65 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72  ect is used to r
21a80 65 70 72 65 73 65 6e 74 20 74 68 65 20 46 52 4f  epresent the FRO
21a90 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 0a 2a 2a  M clause of a.**
21aa0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21ab0 74 2c 20 61 6e 64 20 74 68 65 20 71 75 65 72 79  t, and the query
21ac0 20 70 6c 61 6e 6e 65 72 20 63 61 6e 6e 6f 74 20   planner cannot 
21ad0 64 65 61 6c 20 77 69 74 68 20 6d 6f 72 65 0a 2a  deal with more.*
21ae0 2a 20 74 68 61 6e 20 36 34 20 74 61 62 6c 65 73  * than 64 tables
21af0 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 53 6f 20   in a join.  So 
21b00 61 6e 79 20 76 61 6c 75 65 20 6c 61 72 67 65 72  any value larger
21b10 20 74 68 61 6e 20 36 34 20 68 65 72 65 0a 2a 2a   than 64 here.**
21b20 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 66   is sufficient f
21b30 6f 72 20 6d 6f 73 74 20 75 73 65 73 2e 20 20 53  or most uses.  S
21b40 6d 61 6c 6c 65 72 20 76 61 6c 75 65 73 2c 20 6c  maller values, l
21b50 69 6b 65 20 73 61 79 20 31 30 2c 20 61 72 65 0a  ike say 10, are.
21b60 2a 2a 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ** appropriate f
21b70 6f 72 20 73 6d 61 6c 6c 20 61 6e 64 20 6d 65 6d  or small and mem
21b80 6f 72 79 2d 6c 69 6d 69 74 65 64 20 61 70 70 6c  ory-limited appl
21b90 69 63 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  ications..*/.#if
21ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ndef SQLITE_MAX_
21bb0 53 52 43 4c 49 53 54 0a 23 20 64 65 66 69 6e 65  SRCLIST.# define
21bc0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c   SQLITE_MAX_SRCL
21bd0 49 53 54 20 32 30 30 0a 23 65 6e 64 69 66 0a 0a  IST 200.#endif..
21be0 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
21bf0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
21c00 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
21c10 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
21c20 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
21c30 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
21c40 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
21c50 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
21c60 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
21c70 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
21c80 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
21c90 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
21ca0 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
21cb0 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
21cc0 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
21cd0 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
21ce0 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
21cf0 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
21d00 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
21d10 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
21d20 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
21d30 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
21d40 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
21d50 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
21d60 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
21d70 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
21d80 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
21d90 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
21da0 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
21db0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
21dc0 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
21dd0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
21de0 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
21df0 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
21e00 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
21e10 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
21e20 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
21e30 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
21e40 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
21e50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
21e60 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
21e70 69 6c 73 20 6f 72 20 74 68 65 20 53 72 63 4c 69  ils or the SrcLi
21e80 73 74 20 62 65 63 6f 6d 65 73 20 74 6f 6f 20 6c  st becomes too l
21e90 61 72 67 65 2c 20 6c 65 61 76 65 0a 2a 2a 20 74  arge, leave.** t
21ea0 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 72 63 4c  he original SrcL
21eb0 69 73 74 20 75 6e 63 68 61 6e 67 65 64 2c 20 72  ist unchanged, r
21ec0 65 74 75 72 6e 20 4e 55 4c 4c 2c 20 61 6e 64 20  eturn NULL, and 
21ed0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
21ee0 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61  essage.** in pPa
21ef0 72 73 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rse..*/.SrcList 
21f00 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
21f10 6e 6c 61 72 67 65 28 0a 20 20 50 61 72 73 65 20  nlarge(.  Parse 
21f20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
21f30 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
21f40 69 6e 74 6f 20 77 68 69 63 68 20 65 72 72 6f 72  into which error
21f50 73 20 61 72 65 20 72 65 70 6f 72 74 65 64 20 2a  s are reported *
21f60 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
21f70 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72  c,     /* The Sr
21f80 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61  cList to be enla
21f90 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rged */.  int nE
21fa0 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  xtra,        /* 
21fb0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c  Number of new sl
21fc0 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53  ots to add to pS
21fd0 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  rc->a[] */.  int
21fe0 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20   iStart         
21ff0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63  /* Index in pSrc
22000 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e  ->a[] of first n
22010 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20  ew slot */.){.  
22020 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e  int i;..  /* San
22030 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
22040 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65  calling paramete
22050 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  rs */.  assert( 
22060 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61  iStart>=0 );.  a
22070 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31  ssert( nExtra>=1
22080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
22090 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rc!=0 );.  asser
220a0 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d  t( iStart<=pSrc-
220b0 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41  >nSrc );..  /* A
220c0 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
220d0 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64  al space if need
220e0 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32  ed */.  if( (u32
220f0 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74  )pSrc->nSrc+nExt
22100 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20  ra>pSrc->nAlloc 
22110 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
22120 70 4e 65 77 3b 0a 20 20 20 20 73 71 6c 69 74 65  pNew;.    sqlite
22130 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d  3_int64 nAlloc =
22140 20 32 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   2*(sqlite3_int6
22150 34 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  4)pSrc->nSrc+nEx
22160 74 72 61 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tra;.    sqlite3
22170 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22180 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  b;..    if( pSrc
22190 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 3d 53  ->nSrc+nExtra>=S
221a0 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49 53  QLITE_MAX_SRCLIS
221b0 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
221c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
221d0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 46 52 4f  e, "too many FRO
221e0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2c 20  M clause terms, 
221f0 6d 61 78 3a 20 25 64 22 2c 0a 20 20 20 20 20 20  max: %d",.      
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 53 51 4c 49 54 45 5f 4d 41 58 5f 53 52 43 4c 49  SQLITE_MAX_SRCLI
22220 53 54 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ST);.      retur
22230 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
22240 66 28 20 6e 41 6c 6c 6f 63 3e 53 51 4c 49 54 45  f( nAlloc>SQLITE
22250 5f 4d 41 58 5f 53 52 43 4c 49 53 54 20 29 20 6e  _MAX_SRCLIST ) n
22260 41 6c 6c 6f 63 20 3d 20 53 51 4c 49 54 45 5f 4d  Alloc = SQLITE_M
22270 41 58 5f 53 52 43 4c 49 53 54 3b 0a 20 20 20 20  AX_SRCLIST;.    
22280 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
22290 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63  Realloc(db, pSrc
222a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
222b0 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b   sizeof(*pSrc) +
222c0 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65   (nAlloc-1)*size
222d0 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29  of(pSrc->a[0]) )
222e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
222f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
22300 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
22310 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
22320 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
22330 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
22340 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d    pSrc->nAlloc =
22350 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 0a 20 20   nAlloc;.  }..  
22360 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
22370 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
22380 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
22390 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
223a0 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
223b0 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
223c0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
223d0 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
223e0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
223f0 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
22400 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
22410 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20  rc += nExtra;.. 
22420 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
22430 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
22440 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
22450 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
22460 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
22470 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
22480 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
22490 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
224a0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
224b0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
224c0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
224d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
224e0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
224f0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
22500 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
22510 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
22520 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
22530 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
22540 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
22550 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
22560 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
22570 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
22580 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
22590 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
225a0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
225b0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
225c0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
225d0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
225e0 6f 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  or or if the.** 
225f0 53 72 63 4c 69 73 74 20 67 72 6f 77 73 20 74 6f  SrcList grows to
22600 20 6c 61 72 67 65 2e 20 20 54 68 65 20 72 65 74   large.  The ret
22610 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
22620 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
22630 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
22640 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
22650 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
22660 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
22670 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
22680 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
22690 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
226a0 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
226b0 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
226c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
226d0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
226e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
226f0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
22700 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
22710 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
22720 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
22730 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
22740 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
22750 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
22760 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
22770 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
22780 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
22790 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
227a0 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
227b0 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
227c0 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
227d0 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
227e0 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
227f0 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
22800 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
22810 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
22820 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
22830 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
22840 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
22850 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
22860 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
22870 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
22880 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
22890 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
228a0 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
228b0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
228c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
228d0 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
228e0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
228f0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22900 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
22910 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
22920 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
22930 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
22940 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
22950 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
22960 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
22970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
22980 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
22990 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
229a0 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
229b0 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
229c0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
229d0 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
229e0 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
229f0 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
22a00 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
22a10 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
22a20 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
22a30 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
22a40 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
22a50 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
22a60 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
22a70 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
22a80 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
22a90 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
22aa0 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
22ab0 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
22ac0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
22ad0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
22ae0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22af0 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
22b00 6e 67 20 63 6f 6e 74 65 78 74 2c 20 69 6e 20 77  ng context, in w
22b10 68 69 63 68 20 65 72 72 6f 72 73 20 61 72 65 20  hich errors are 
22b20 72 65 70 6f 72 74 65 64 20 2a 2f 0a 20 20 53 72  reported */.  Sr
22b30 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  cList *pList,   
22b40 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
22b50 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c  his SrcList. NUL
22b60 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20  L creates a new 
22b70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b  SrcList */.  Tok
22b80 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
22b90 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70   /* Table to app
22ba0 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  end */.  Token *
22bb0 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20  pDatabase    /* 
22bc0 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20  Database of the 
22bd0 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74  table */.){.  st
22be0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
22bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
22c00 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72  te3 *db;.  asser
22c10 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
22c20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
22c30 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
22c40 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
22c50 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
22c60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22c70 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
22c80 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
22c90 64 62 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  db;.  if( pList=
22ca0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
22cb0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
22cc0 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e 64  cRawNN(pParse->d
22cd0 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
22ce0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
22cf0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
22d00 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
22d10 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 20 20 70 4c  lloc = 1;.    pL
22d20 69 73 74 2d 3e 6e 53 72 63 20 3d 20 31 3b 0a 20  ist->nSrc = 1;. 
22d30 20 20 20 6d 65 6d 73 65 74 28 26 70 4c 69 73 74     memset(&pList
22d40 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[0], 0, sizeo
22d50 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
22d60 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
22d70 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
22d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 72 63 4c   }else{.    SrcL
22d90 69 73 74 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  ist *pNew = sqli
22da0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
22db0 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  e(pParse, pList,
22dc0 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
22dd0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
22de0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
22df0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
22e00 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
22e10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
22e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
22e30 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  st = pNew;.    }
22e40 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
22e50 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
22e60 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70  nSrc-1];.  if( p
22e70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74  Database && pDat
22e80 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  abase->z==0 ){. 
22e90 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30     pDatabase = 0
22ea0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74  ;.  }.  if( pDat
22eb0 61 62 61 73 65 20 29 7b 0a 20 20 20 20 70 49 74  abase ){.    pIt
22ec0 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
22ed0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
22ee0 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
22ef0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74  .    pItem->zDat
22f00 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e  abase = sqlite3N
22f10 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
22f20 20 70 54 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73   pTable);.  }els
22f30 65 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  e{.    pItem->zN
22f40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
22f50 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
22f60 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 49 74 65  Table);.    pIte
22f70 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
22f80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
22f90 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
22fa0 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
22fb0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
22fc0 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
22fd0 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
22fe0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
22ff0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
23000 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
23010 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
23020 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
23030 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
23040 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
23050 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
23060 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23070 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
23080 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
23090 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
230a0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
230b0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
230c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
230d0 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
230e0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
230f0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
23100 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
23110 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
23120 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
23130 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
23140 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
23150 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
23160 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
23170 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
23180 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
23190 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
231a0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
231b0 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
231c0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
231d0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
231e0 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
231f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
23200 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23210 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
23220 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
23230 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
23240 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
23250 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
23260 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
23270 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23280 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
23290 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
232a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
232b0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
232c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
232d0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
232e0 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  s);.    if( pIte
232f0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
23300 79 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  y ) sqlite3DbFre
23310 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  e(db, pItem->u1.
23320 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
23330 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
23340 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74  sTabFunc ) sqlit
23350 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
23360 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  (db, pItem->u1.p
23370 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71  FuncArg);.    sq
23380 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
23390 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
233a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
233b0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
233c0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
233d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
233e0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
233f0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
23400 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
23410 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
23420 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
23430 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69  DbFreeNN(db, pLi
23440 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
23450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
23460 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
23470 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20  er to add a new 
23480 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65  term to the.** e
23490 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20  nd of a growing 
234a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
234b0 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
234c0 69 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a  is the part of.*
234d0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
234e0 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
234f0 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  dy been construc
23500 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c  ted.  "p" is NUL
23510 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  L.** if this is 
23520 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
23530 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
23540 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70  e.  pTable and p
23550 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20  Database.** are 
23560 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
23570 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61  table and databa
23580 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  se named in the 
23590 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
235a0 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69  ..** pDatabase i
235b0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61  s NULL if the da
235c0 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c  tabase name qual
235d0 69 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67  ifier is missing
235e0 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20   - the.** usual 
235f0 63 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65  case.  If the te
23600 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c  rm has an alias,
23610 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69   then pAlias poi
23620 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c  nts to the.** al
23630 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74  ias token.  If t
23640 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62  he term is a sub
23650 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62  query, then pSub
23660 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20  query is the.** 
23670 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
23680 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65   that the subque
23690 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65  ry encodes.  The
236a0 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70   pTable and.** p
236b0 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74  Database paramet
236c0 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72  ers are NULL for
236d0 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68   subqueries.  Th
236e0 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67  e pOn and pUsing
236f0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61  .** parameters a
23700 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  re the content o
23710 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  f the ON and USI
23720 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  NG clauses..**.*
23730 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53  * Return a new S
23740 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63  rcList which enc
23750 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d  odes is the FROM
23760 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a   with the new.**
23770 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a   term added..*/.
23780 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
23790 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
237a0 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  mTerm(.  Parse *
237b0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
237c0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
237d0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
237e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
237f0 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72   /* The left par
23800 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
23810 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65  ause already see
23820 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  n */.  Token *pT
23830 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
23840 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
23850 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68  ble to add to th
23860 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
23870 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
23880 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  ase,       /* Na
23890 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
238a0 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54  se containing pT
238b0 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  able */.  Token 
238c0 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20  *pAlias,        
238d0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68    /* The right-h
238e0 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
238f0 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  AS subexpression
23900 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
23910 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a  ubquery,      /*
23920 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64   A subquery used
23930 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74   in place of a t
23940 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45  able name */.  E
23950 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20  xpr *pOn,       
23960 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e         /* The ON
23970 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69   clause of a joi
23980 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70  n */.  IdList *p
23990 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f  Using          /
239a0 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75  * The USING clau
239b0 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
239c0 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
239d0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
239e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
239f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
23a00 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c  f( !p && (pOn ||
23a10 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20   pUsing) ){.    
23a20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23a30 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20  pParse, "a JOIN 
23a40 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
23a50 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a  ed before %s", .
23a60 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e        (pOn ? "ON
23a70 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20  " : "USING").   
23a80 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   );.    goto app
23a90 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
23aa0 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
23ab0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
23ac0 50 61 72 73 65 2c 20 70 2c 20 70 54 61 62 6c 65  Parse, p, pTable
23ad0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
23ae0 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
23af0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
23b00 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 61 73  _error;.  }.  as
23b10 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 3e 30 20  sert( p->nSrc>0 
23b20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d  );.  pItem = &p-
23b30 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
23b40 20 61 73 73 65 72 74 28 20 28 70 54 61 62 6c 65   assert( (pTable
23b50 3d 3d 30 29 3d 3d 28 70 44 61 74 61 62 61 73 65  ==0)==(pDatabase
23b60 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
23b70 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pItem->zName==
23b80 30 20 7c 7c 20 70 44 61 74 61 62 61 73 65 21 3d  0 || pDatabase!=
23b90 30 20 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45  0 );.  if( IN_RE
23ba0 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70  NAME_OBJECT && p
23bb0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
23bc0 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e     Token *pToken
23bd0 20 3d 20 28 41 4c 57 41 59 53 28 70 44 61 74 61   = (ALWAYS(pData
23be0 62 61 73 65 29 20 26 26 20 70 44 61 74 61 62 61  base) && pDataba
23bf0 73 65 2d 3e 7a 29 20 3f 20 70 44 61 74 61 62 61  se->z) ? pDataba
23c00 73 65 20 3a 20 70 54 61 62 6c 65 3b 0a 20 20 20  se : pTable;.   
23c10 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
23c20 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20 70  kenMap(pParse, p
23c30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 6f  Item->zName, pTo
23c40 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ken);.  }.  asse
23c50 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b  rt( pAlias!=0 );
23c60 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e  .  if( pAlias->n
23c70 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a   ){.    pItem->z
23c80 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e  Alias = sqlite3N
23c90 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
23ca0 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20   pAlias);.  }.  
23cb0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pItem->pSelect =
23cc0 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49   pSubquery;.  pI
23cd0 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a  tem->pOn = pOn;.
23ce0 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20    pItem->pUsing 
23cf0 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75  = pUsing;.  retu
23d00 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66  rn p;.. append_f
23d10 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73  rom_error:.  ass
23d20 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73  ert( p==0 );.  s
23d30 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
23d40 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c  (db, pOn);.  sql
23d50 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
23d60 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20  (db, pUsing);.  
23d70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
23d80 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
23d90 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  y);.  return 0;.
23da0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
23db0 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f  INDEXED BY or NO
23dc0 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
23dd0 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
23de0 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20  ently added .** 
23df0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73  element of the s
23e00 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65  ource-list passe
23e10 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23e20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
23e30 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
23e40 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20  IndexedBy(Parse 
23e50 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
23e60 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64   *p, Token *pInd
23e70 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72  exedBy){.  asser
23e80 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30  t( pIndexedBy!=0
23e90 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
23ea0 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3e 30 20 29  IndexedBy->n>0 )
23eb0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
23ec0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
23ee0 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 20 20 70  >nSrc>0 );.    p
23ef0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
23f00 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
23f10 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6e  ert( pItem->fg.n
23f20 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 3b 0a  otIndexed==0 );.
23f30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
23f40 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
23f50 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  y==0 );.    asse
23f60 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
23f70 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
23f80 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
23f90 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65  ->n==1 && !pInde
23fa0 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20  xedBy->z ){.    
23fb0 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45    /* A "NOT INDE
23fc0 58 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20  XED" clause was 
23fd0 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61  supplied. See pa
23fe0 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20  rse.y .      ** 
23ff0 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78  construct "index
24000 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61  ed_opt" for deta
24010 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49  ils. */.      pI
24020 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  tem->fg.notIndex
24030 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
24040 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
24050 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
24060 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
24070 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
24080 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20   pIndexedBy);.  
24090 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
240a0 49 6e 64 65 78 65 64 42 79 20 3d 20 31 3b 0a 20  IndexedBy = 1;. 
240b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
240c0 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
240d0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
240e0 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
240f0 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
24100 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
24110 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
24120 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
24130 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
24140 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
24150 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
24160 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
24170 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
24180 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
24190 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
241a0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
241b0 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
241c0 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
241d0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
241e0 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
241f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24200 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
24210 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
24220 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
24230 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
24240 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
24250 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
24260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
24270 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
24280 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
24290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
242a0 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
242b0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
242c0 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
242d0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
242e0 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
242f0 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
24300 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
24310 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
24320 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
24330 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
24340 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
24350 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
24360 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
24370 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
24380 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
24390 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
243a0 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
243b0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
243c0 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
243d0 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
243e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
243f0 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
24400 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
24410 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
24420 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
24430 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
24440 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
24450 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
24460 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
24470 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
24480 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
24490 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
244a0 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
244b0 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
244c0 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
244d0 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
244e0 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
244f0 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
24500 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
24510 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
24520 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
24530 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
24540 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
24550 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
24560 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
24570 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
24580 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
24590 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
245a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
245b0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
245c0 66 6f 72 20 61 20 42 45 47 49 4e 20 73 74 61 74  for a BEGIN stat
245d0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
245e0 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73  qlite3BeginTrans
245f0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
24600 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b  arse, int type){
24610 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
24620 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
24630 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
24640 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62  Parse!=0 );.  db
24650 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
24660 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
24670 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
24680 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
24690 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
246a0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
246b0 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
246c0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
246d0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
246e0 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
246f0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
24700 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
24710 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
24720 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
24730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24740 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
24750 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
24760 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
24770 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
24780 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
24790 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
247a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
247b0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 41 75  eAddOp0(v, OP_Au
247c0 74 6f 43 6f 6d 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a  toCommit);.}../*
247d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
247e0 45 20 63 6f 64 65 20 66 6f 72 20 61 20 43 4f 4d  E code for a COM
247f0 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  MIT or ROLLBACK 
24800 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 43 6f  statement..** Co
24810 64 65 20 66 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  de for ROLLBACK 
24820 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 66 20  is generated if 
24830 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41  eType==TK_ROLLBA
24840 43 4b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  CK.  Otherwise.*
24850 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  * code is genera
24860 74 65 64 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54  ted for a COMMIT
24870 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24880 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
24890 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
248a0 6e 74 20 65 54 79 70 65 29 7b 0a 20 20 56 64 62  nt eType){.  Vdb
248b0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 73 52 6f  e *v;.  int isRo
248c0 6c 6c 62 61 63 6b 3b 0a 0a 20 20 61 73 73 65 72  llback;..  asser
248d0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
248e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
248f0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
24900 65 72 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 43  ert( eType==TK_C
24910 4f 4d 4d 49 54 20 7c 7c 20 65 54 79 70 65 3d 3d  OMMIT || eType==
24920 54 4b 5f 45 4e 44 20 7c 7c 20 65 54 79 70 65 3d  TK_END || eType=
24930 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  =TK_ROLLBACK );.
24940 20 20 69 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 65    isRollback = e
24950 54 79 70 65 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43  Type==TK_ROLLBAC
24960 4b 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  K;.  if( sqlite3
24970 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
24980 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
24990 54 49 4f 4e 2c 20 0a 20 20 20 20 20 20 20 69 73  TION, .       is
249a0 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c  Rollback ? "ROLL
249b0 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22  BACK" : "COMMIT"
249c0 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
249d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
249e0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
249f0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
24a00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
24a10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
24a20 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 69  AutoCommit, 1, i
24a30 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a  sRollback);.  }.
24a40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24a50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24a60 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
24a70 68 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20  hen it parses a 
24a80 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74  command to creat
24a90 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72  e,.** release or
24aa0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c   rollback an SQL
24ab0 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a   savepoint. .*/.
24ac0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65  void sqlite3Save
24ad0 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61  point(Parse *pPa
24ae0 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
24af0 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
24b00 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
24b10 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
24b20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
24b30 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
24b40 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
24b50 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
24b60 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
24b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24b80 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
24b90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
24ba0 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d  r * const az[] =
24bb0 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c   { "BEGIN", "REL
24bc0 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b  EASE", "ROLLBACK
24bd0 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " };.    assert(
24be0 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49   !SAVEPOINT_BEGI
24bf0 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  N && SAVEPOINT_R
24c00 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56  ELEASE==1 && SAV
24c10 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d  EPOINT_ROLLBACK=
24c20 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =2 );.#endif.   
24c30 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74   if( !v || sqlit
24c40 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
24c50 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50  se, SQLITE_SAVEP
24c60 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e  OINT, az[op], zN
24c70 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  ame, 0) ){.     
24c80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
24c90 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
24ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
24cb0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24cc0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
24cd0 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70  OP_Savepoint, op
24ce0 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50  , 0, 0, zName, P
24cf0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
24d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
24d10 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61  re the TEMP data
24d20 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64  base is open and
24d30 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
24d40 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  se.  Return.** t
24d50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
24d60 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20  ors.  Leave any 
24d70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
24d80 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
24d90 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
24da0 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61  qlite3OpenTempDa
24db0 74 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50  tabase(Parse *pP
24dc0 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
24dd0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
24de0 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  b;.  if( db->aDb
24df0 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70  [1].pBt==0 && !p
24e00 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
24e10 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
24e20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20    Btree *pBt;.  
24e30 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
24e40 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20  nt flags = .    
24e50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
24e60 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20  N_READWRITE |.  
24e70 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
24e80 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
24e90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
24ea0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
24eb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24ec0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
24ed0 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  SE |.          S
24ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
24ef0 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  DB;..    rc = sq
24f00 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64  lite3BtreeOpen(d
24f10 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20  b->pVfs, 0, db, 
24f20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b  &pBt, 0, flags);
24f30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24f40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24f50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
24f60 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
24f70 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
24f80 61 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20  ary database ". 
24f90 20 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72         "file for
24fa0 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61   storing tempora
24fb0 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20  ry tables");.   
24fc0 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
24fd0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
24fe0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   1;.    }.    db
24ff0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70  ->aDb[1].pBt = p
25000 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
25010 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
25020 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ma );.    if( SQ
25030 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69  LITE_NOMEM==sqli
25040 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
25050 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78  ize(pBt, db->nex
25060 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30  tPagesize, -1, 0
25070 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
25080 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
25090 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
250a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
250b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
250c0 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
250d0 68 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63  hat the schema c
250e0 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20  ookie will need 
250f0 74 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a  to be verified.*
25100 2a 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69  * for database i
25110 44 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f  Db.  The code to
25120 20 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79   actually verify
25130 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
25140 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72  ie.** will occur
25150 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
25160 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42  he top-level VDB
25170 45 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65  E and will be ge
25180 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72  nerated.** later
25190 2c 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69  , by sqlite3Fini
251a0 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76  shCoding()..*/.v
251b0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56  oid sqlite3CodeV
251c0 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73  erifySchema(Pars
251d0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
251e0 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  Db){.  Parse *pT
251f0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
25200 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
25210 50 61 72 73 65 29 3b 0a 0a 20 20 61 73 73 65 72  Parse);..  asser
25220 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62  t( iDb>=0 && iDb
25230 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62  <pParse->db->nDb
25240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25250 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
25260 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62  b].pBt!=0 || iDb
25270 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
25280 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f   iDb<SQLITE_MAX_
25290 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20  ATTACHED+2 );.  
252a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
252b0 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 70  chemaMutexHeld(p
252c0 50 61 72 73 65 2d 3e 64 62 2c 20 69 44 62 2c 20  Parse->db, iDb, 
252d0 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61  0) );.  if( DbMa
252e0 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c  skTest(pToplevel
252f0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
25300 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d  b)==0 ){.    DbM
25310 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c  askSet(pToplevel
25320 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44  ->cookieMask, iD
25330 62 29 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49  b);.    if( !OMI
25340 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
25350 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
25360 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
25370 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
25380 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
25390 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  ** If argument z
253a0 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  Db is NULL, then
253b0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64   call sqlite3Cod
253c0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29 20  eVerifySchema() 
253d0 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74 74  for each .** att
253e0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e 20  ached database. 
253f0 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b  Otherwise, invok
25400 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61 74  e it for the dat
25410 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62 20  abase named zDb 
25420 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
25430 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
25440 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73 65  amedSchema(Parse
25450 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
25460 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71  char *zDb){.  sq
25470 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
25480 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b  se->db;.  int i;
25490 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
254a0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
254b0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
254c0 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[i];.    if( 
254d0 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a 44  pDb->pBt && (!zD
254e0 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53  b || 0==sqlite3S
254f0 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d  trICmp(zDb, pDb-
25500 3e 7a 44 62 53 4e 61 6d 65 29 29 20 29 7b 0a 20  >zDbSName)) ){. 
25510 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
25520 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
25530 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  rse, i);.    }. 
25540 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
25550 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
25560 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
25570 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
25580 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
25590 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
255a0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
255b0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
255c0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
255d0 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
255e0 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
255f0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
25600 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
25610 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
25620 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
25630 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
25640 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
25650 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
25660 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
25670 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
25680 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
25690 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
256a0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
256b0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
256c0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
256d0 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
256e0 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
256f0 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
25700 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
25710 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
25720 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
25730 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
25740 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
25750 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
25760 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
25770 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
25780 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
25790 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
257a0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
257b0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
257c0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
257d0 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
257e0 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
257f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
25800 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
25810 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
25820 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
25830 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
25840 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
25850 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
25860 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
25870 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
25880 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
25890 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53   iDb);.  DbMaskS
258a0 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72  et(pToplevel->wr
258b0 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  iteMask, iDb);. 
258c0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
258d0 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53  ltiWrite |= setS
258e0 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  tatement;.}../*.
258f0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
25900 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63   the statement c
25910 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
25920 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68  onstruction migh
25930 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20  t write.** more 
25940 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28  than one entry (
25950 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e  example: deletin
25960 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69  g one row then i
25970 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72  nserting another
25980 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d  ,.** inserting m
25990 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20  ultiple rows in 
259a0 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65  a table, or inse
259b0 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20  rting a row and 
259c0 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a  index entries.).
259d0 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f  ** If an abort o
259e0 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65  ccurs after some
259f0 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73   of these writes
25a00 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c   have completed,
25a10 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a   then it will.**
25a20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
25a30 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65   undo the comple
25a40 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76  ted writes..*/.v
25a50 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69  oid sqlite3Multi
25a60 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61  Write(Parse *pPa
25a70 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  rse){.  Parse *p
25a80 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
25a90 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
25aa0 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c  pParse);.  pTopl
25ab0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
25ac0 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  te = 1;.}../* .*
25ad0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
25ae0 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ator calls this 
25af0 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69  routine if is di
25b00 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20  scovers that it 
25b10 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
25b20 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d  o abort a statem
25b30 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d  ent prior to com
25b40 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64  pletion.  In ord
25b50 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72  er to .** perfor
25b60 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74  m this abort wit
25b70 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20  hout corrupting 
25b80 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65  the database, we
25b90 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a   need to make.**
25ba0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
25bb0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74  tatement is prot
25bc0 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65  ected by a state
25bd0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
25be0 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61  ..**.** Technica
25bf0 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65  lly, we only nee
25c00 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79  d to set the may
25c10 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68  Abort flag if th
25c20 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74  e.** isMultiWrit
25c30 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69  e flag was previ
25c40 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72  ously set.  Ther
25c50 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65  e is a time depe
25c60 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74  ndency.** such t
25c70 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75  hat the abort mu
25c80 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  st occur after t
25c90 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20  he multiwrite.  
25ca0 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f  This makes.** so
25cb0 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  me statements in
25cc0 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c  volving the REPL
25cd0 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
25ce0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
25cf0 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65  m.** go a little
25d00 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61   faster.  But ta
25d10 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f  king advantage o
25d20 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65  f this time depe
25d30 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20  ndency.** makes 
25d40 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c  it more difficul
25d50 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  t to prove that 
25d60 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72  the code is corr
25d70 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74  ect (in .** part
25d80 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65  icular, it preve
25d90 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74  nts us from writ
25da0 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65  ing an effective
25db0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
25dc0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73  on of sqlite3Ass
25dd0 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61  ertMayAbort()) a
25de0 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68  nd so we have ch
25df0 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20  osen.** to take 
25e00 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61  the safe route a
25e10 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69  nd skip the opti
25e20 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  mization..*/.voi
25e30 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72  d sqlite3MayAbor
25e40 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  t(Parse *pParse)
25e50 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
25e60 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
25e70 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
25e80 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
25e90 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a  ->mayAbort = 1;.
25ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
25eb0 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61   OP_Halt that ca
25ec0 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f  uses the vdbe to
25ed0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
25ee0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20  E_CONSTRAINT.** 
25ef0 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72  error. The onErr
25f00 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  or parameter det
25f10 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69  ermines which (i
25f20 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74  f any) of the st
25f30 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f  atement.** and/o
25f40 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  r current transa
25f50 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
25f60 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  back..*/.void sq
25f70 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
25f80 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
25f90 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
25fa0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
25fb0 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20   int errCode,   
25fc0 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65     /* extended e
25fd0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
25fe0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
25ff0 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
26000 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ype */.  char *p
26010 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72  4,         /* Er
26020 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
26030 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20   i8 p4type,     
26040 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20     /* P4_STATIC 
26050 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20  or P4_TRANSIENT 
26060 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67  */.  u8 p5Errmsg
26070 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72         /* P5_Err
26080 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  Msg type */.){. 
26090 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
260a0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
260b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72  );.  assert( (er
260c0 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c  rCode&0xff)==SQL
260d0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
260e0 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d  ;.  if( onError=
260f0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
26100 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
26110 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
26120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26130 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72  4(v, OP_Halt, er
26140 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20  rCode, onError, 
26150 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a  0, p4, p4type);.
26160 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26170 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
26180 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
26190 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
261a0 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
261b0 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
261c0 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
261d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
261e0 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
261f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26200 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
26210 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
26220 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
26230 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
26240 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
26250 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
26260 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
26270 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
26280 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
26290 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
262a0 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
262b0 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
262c0 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
262d0 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
262e0 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
262f0 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20   pParse->db, 0, 
26300 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
26310 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
26320 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
26330 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
26340 5d 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  ]);.  if( pIdx->
26350 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20  aColExpr ){.    
26360 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
26370 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e  ndf(&errMsg, "in
26380 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
26390 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
263a0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
263b0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
263c0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
263d0 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
263e0 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
263f0 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
26400 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
26410 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
26420 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
26430 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
26440 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
26450 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
26460 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
26470 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28  3_str_appendall(
26480 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a  &errMsg, pTab->z
26490 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
264a0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
264b0 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29  &errMsg, ".", 1)
264c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
264d0 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65  str_appendall(&e
264e0 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
264f0 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d    }.  }.  zErr =
26500 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
26510 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b  Finish(&errMsg);
26520 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
26530 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
26540 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b   .    IsPrimaryK
26550 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20  eyIndex(pIdx) ? 
26560 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
26570 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20  T_PRIMARYKEY .  
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26590 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49            : SQLI
265a0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
265b0 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f  IQUE,.    onErro
265c0 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41  r, zErr, P4_DYNA
265d0 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69  MIC, P5_Constrai
265e0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f  ntUnique);.}.../
265f0 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
26600 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d  Halt due to non-
26610 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f  unique rowid..*/
26620 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77  .void sqlite3Row
26630 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  idConstraint(.  
26640 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
26650 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
26660 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
26670 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
26680 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
26690 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  on algorithm */.
266a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20    Table *pTab   
266b0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
266c0 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e   with the non-un
266d0 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29  ique rowid */ .)
266e0 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
266f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
26700 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29  pTab->iPKey>=0 )
26710 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
26720 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
26730 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c  se->db, "%s.%s",
26740 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
26770 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
26780 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
26790 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
267a0 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  NT_PRIMARYKEY;. 
267b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67   }else{.    zMsg
267c0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
267d0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
267e0 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e  s.rowid", pTab->
267f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
26800 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
26810 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20  NT_ROWID;.  }.  
26820 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
26830 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63  raint(pParse, rc
26840 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c  , onError, zMsg,
26850 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20   P4_DYNAMIC,.   
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69       P5_Constrai
26880 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a  ntUnique);.}../*
26890 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
268a0 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20   if pIndex uses 
268b0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
268c0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52  quence pColl.  R
268d0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
268e0 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c   it does and fal
268f0 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  se if it does no
26900 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
26910 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
26920 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c  X.static int col
26930 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73  lationMatch(cons
26940 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49  t char *zColl, I
26950 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20  ndex *pIndex){. 
26960 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
26970 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
26980 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65  for(i=0; i<pInde
26990 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
269a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
269b0 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   *z = pIndex->az
269c0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73  Coll[i];.    ass
269d0 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e  ert( z!=0 || pIn
269e0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
269f0 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  <0 );.    if( pI
26a00 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
26a10 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74  ]>=0 && 0==sqlit
26a20 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f  e3StrICmp(z, zCo
26a30 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ll) ){.      ret
26a40 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
26a50 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
26a60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
26a70 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
26a80 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
26a90 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
26aa0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
26ab0 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
26ac0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
26ad0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
26ae0 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
26af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
26b00 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
26b10 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
26b20 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
26b30 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
26b40 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 69  nst *zColl){.  i
26b50 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  f( !IsVirtual(pT
26b60 61 62 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  ab) ){.    Index
26b70 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
26b80 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
26b90 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
26ba0 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20  th pTab */..    
26bb0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
26bc0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
26bd0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
26be0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
26bf0 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
26c00 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
26c10 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
26c20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
26c30 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
26c40 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
26c50 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
26c60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
26c70 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
26c80 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
26c90 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
26ca0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
26cb0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
26cc0 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -1);.      }.  
26cd0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
26ce0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
26cf0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
26d00 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
26d10 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
26d20 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
26d30 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
26d40 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
26d50 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
26d60 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
26d70 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
26d80 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
26d90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26da0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
26db0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
26dc0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
26dd0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
26de0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
26df0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
26e00 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
26e10 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
26e20 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
26e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e40 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
26e50 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
26e60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
26e70 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
26e80 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
26e90 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
26ea0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
26eb0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
26ec0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
26ed0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
26ee0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
26ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
26f00 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
26f10 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
26f20 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
26f30 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
26f40 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
26f50 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
26f60 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
26f70 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
26f80 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
26f90 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
26fa0 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
26fb0 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
26fc0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
26fd0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
26fe0 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
26ff0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
27000 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
27010 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
27020 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
27030 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
27040 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
27050 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
27060 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
27070 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
27080 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
27090 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
270a0 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
270d0 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
270e0 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
270f0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
27100 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
27110 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
27120 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
27130 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
27140 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
27150 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
27160 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
27170 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
27180 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
27190 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
271a0 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
271b0 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
271c0 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
271d0 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
271e0 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
271f0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
27200 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
27210 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
27220 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
27230 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
27240 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
27250 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
27260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27270 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
27280 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
27290 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
272a0 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
272b0 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
272c0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
272d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
272e0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
272f0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
27300 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
27310 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
27320 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
27330 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
27340 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
27350 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
27360 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
27370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
27380 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
273a0 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
273b0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
273c0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
273d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
273e0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
273f0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
27400 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27420 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
27430 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
27440 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
27450 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
27460 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
27470 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
27480 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
27490 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
274a0 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
274b0 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
274c0 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
274d0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
274e0 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
274f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
27500 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
27510 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
27520 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
27530 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
27540 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
27550 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
27560 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
27570 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
27580 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
27590 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
275a0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
275b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
275c0 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
275d0 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
275e0 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
275f0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
27600 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
27610 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
27620 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
27630 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
27640 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
27650 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
27660 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
27670 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
27680 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
27690 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
276a0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
276b0 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
276c0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
276d0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
276e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
276f0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
27700 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
27710 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
27720 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
27730 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
27740 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
27750 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
27760 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
27770 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
27780 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
27790 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
277a0 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
277b0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
277c0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
277d0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
277e0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
277f0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
27800 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
27810 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
27820 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
27830 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
27840 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
27850 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
27860 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
27870 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
27880 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
27890 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
278a0 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
278b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
278c0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
278d0 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
278e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
278f0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
27900 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
27910 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
27920 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
27930 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
27940 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
27950 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
27960 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
27970 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
27980 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
27990 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
279a0 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
279b0 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
279c0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73  .** The caller s
279d0 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
279e0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
279f0 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e  () on the return
27a00 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65  ed object.** whe
27a10 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65  n it has finishe
27a20 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b  d using it..*/.K
27a30 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
27a40 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61  eyInfoOfIndex(Pa
27a50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
27a60 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74  ex *pIdx){.  int
27a70 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   i;.  int nCol =
27a80 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
27a90 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
27aa0 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65  x->nKeyCol;.  Ke
27ab0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69  yInfo *pKey;.  i
27ac0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
27ad0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
27ae0 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  ( pIdx->uniqNotN
27af0 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20  ull ){.    pKey 
27b00 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
27b10 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
27b20 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
27b30 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
27b40 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
27b50 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
27b60 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29  se->db, nCol, 0)
27b70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79  ;.  }.  if( pKey
27b80 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27b90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
27ba0 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
27bb0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
27bc0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
27bd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27be0 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
27bf0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Coll[i];.      p
27c00 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
27c10 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74  zColl==sqlite3St
27c20 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20  rBINARY ? 0 :.  
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
27c50 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
27c60 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
27c70 20 70 4b 65 79 2d 3e 61 53 6f 72 74 46 6c 61 67   pKey->aSortFlag
27c80 73 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f  s[i] = pIdx->aSo
27c90 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20  rtOrder[i];.    
27ca0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 4b    assert( 0==(pK
27cb0 65 79 2d 3e 61 53 6f 72 74 46 6c 61 67 73 5b 69  ey->aSortFlags[i
27cc0 5d 20 26 20 4b 45 59 49 4e 46 4f 5f 4f 52 44 45  ] & KEYINFO_ORDE
27cd0 52 5f 42 49 47 4e 55 4c 4c 29 20 29 3b 0a 20 20  R_BIGNULL) );.  
27ce0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
27cf0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
27d00 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
27d10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ->rc==SQLITE_ERR
27d20 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53  OR_MISSING_COLLS
27d30 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  EQ );.      if( 
27d40 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d  pIdx->bNoQuery==
27d50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
27d60 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69  Deactivate the i
27d70 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20  ndex because it 
27d80 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e  contains an unkn
27d90 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  own collating.  
27da0 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63        ** sequenc
27db0 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  e.  The only way
27dc0 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65   to reactive the
27dd0 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c   index is to rel
27de0 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  oad the.        
27df0 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69  ** schema.  Addi
27e00 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63  ng the missing c
27e10 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
27e20 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74  e later does not
27e30 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63  .        ** reac
27e40 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20  tive the index. 
27e50 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   The application
27e60 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20   had the chance 
27e70 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20  to register.    
27e80 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69      ** the missi
27e90 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  ng index using t
27ea0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65  he collation-nee
27eb0 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46  ded callback.  F
27ec0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  or.        ** si
27ed0 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65  mplicity, SQLite
27ee0 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74   will not give t
27ef0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61  he application a
27f00 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a   second chance..
27f10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27f20 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72     pIdx->bNoQuer
27f30 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
27f40 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
27f50 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a  TE_ERROR_RETRY;.
27f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
27f70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
27f80 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70  f(pKey);.      p
27f90 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Key = 0;.    }. 
27fa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
27fb0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
27fc0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20  ITE_OMIT_CTE./* 
27fd0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27fe0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
27ff0 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20   per CTE by the 
28000 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72  parser while par
28010 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20  sing a .** WITH 
28020 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68  clause. .*/.With
28030 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64   *sqlite3WithAdd
28040 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
28050 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
28060 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
28070 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  /.  With *pWith,
28080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28090 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61  xisting WITH cla
280a0 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
280b0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20    Token *pName, 
280c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
280d0 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d  e of the common-
280e0 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
280f0 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20  ist *pArglist,  
28100 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63     /* Optional c
28110 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20  olumn name list 
28120 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
28130 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72  .  Select *pQuer
28140 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  y          /* Qu
28150 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74  ery used to init
28160 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65  ialize the table
28170 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28180 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
28190 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b  b;.  With *pNew;
281a0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
281b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
281c0 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73   the CTE name is
281d0 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74   unique within t
281e0 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e  his WITH clause.
281f0 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74   If.  ** not, st
28200 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ore an error in 
28210 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
28220 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20  ure. */.  zName 
28230 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
28240 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
28250 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
28260 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20   zName && pWith 
28270 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
28280 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69    for(i=0; i<pWi
28290 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  th->nCte; i++){.
282a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
282b0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
282c0 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pWith->a[i].zNam
282d0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
282e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
282f0 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
28300 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e  ate WITH table n
28310 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29  ame: %s", zName)
28320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28330 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68    }..  if( pWith
28340 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
28350 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69  int64 nByte = si
28360 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28  zeof(*pWith) + (
28370 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b  sizeof(pWith->a[
28380 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74  1]) * pWith->nCt
28390 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  e);.    pNew = s
283a0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
283b0 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65  db, pWith, nByte
283c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
283d0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
283e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
283f0 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a  izeof(*pWith));.
28400 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 70    }.  assert( (p
28410 4e 65 77 21 3d 30 20 26 26 20 7a 4e 61 6d 65 21  New!=0 && zName!
28420 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
28430 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 69 66  cFailed );..  if
28440 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
28450 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
28460 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
28470 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20  db, pArglist);. 
28480 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
28490 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72  Delete(db, pQuer
284a0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
284b0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
284c0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69  ;.    pNew = pWi
284d0 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th;.  }else{.   
284e0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
284f0 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70  Cte].pSelect = p
28500 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d  Query;.    pNew-
28510 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
28520 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b  Cols = pArglist;
28530 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
28540 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d  w->nCte].zName =
28550 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77   zName;.    pNew
28560 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
28570 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20  zCteErr = 0;.   
28580 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20   pNew->nCte++;. 
28590 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   }..  return pNe
285a0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  w;.}../*.** Free
285b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
285c0 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
285d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
285e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
285f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
28600 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ithDelete(sqlite
28610 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69  3 *db, With *pWi
28620 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
28630 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
28640 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
28650 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  ith->nCte; i++){
28660 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 43 74  .      struct Ct
28670 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68  e *pCte = &pWith
28680 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
28690 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
286a0 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43  ete(db, pCte->pC
286b0 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ols);.      sqli
286c0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
286d0 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
286e0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
286f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 74 65  3DbFree(db, pCte
28700 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
28710 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
28720 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20  e(db, pWith);.  
28730 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
28740 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
28750 49 54 5f 43 54 45 29 20 2a 2f 0a                 IT_CTE) */.